0
我正在使用MVVM模式,並嘗試僅在用戶按登錄按鈕時才顯示警告標籤。現在他們沒有出現,因爲我不知道如何僅以用戶操作顯示它們。然後在用戶開始編輯時,應該隱藏相應標籤的警告。 這裏是我的ViewController該處理參考視圖模型:RxSwift - 按下按鈕時顯示/隱藏警告標籤
import UIKit
import RxSwift
import RxCocoa
class RxLoginViewController: UIViewController {
@IBOutlet weak var signInButton: UIButton!
@IBOutlet weak var phoneNumberTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var phoneWarningLabel: UILabel!
@IBOutlet weak var passwordWarningLabel: UILabel!
fileprivate var viewModel: RxLoginViewModel?
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
viewModel = RxLoginViewModel(phoneNumber: phoneNumberTextField.rx.text.orEmpty.asDriver(), passwordText: passwordTextField.rx.text.orEmpty.asDriver())
addBindsToViewModel(viewModel: viewModel!)
setupButtons()
}
fileprivate func addBindsToViewModel(viewModel: RxLoginViewModel) {
phoneNumberTextField.rx.text
.orEmpty
.asObservable()
.debug("phoneNumberTextField")
.bindTo(viewModel.phoneNumberText)
.addDisposableTo(disposeBag)
passwordTextField.rx.text
.orEmpty
.asObservable()
.debug("passwordTextField")
.bindTo(viewModel.passwordText)
.addDisposableTo(disposeBag)
viewModel.showPhoneWarning
.asDriver()
.debug("showPhoneWarning")
.drive(onNext: { [weak self] showWarning in
UIView.animate(withDuration: 0.2) {
self?.phoneWarningLabel.isHidden = !showWarning
}}
)
.addDisposableTo(disposeBag)
viewModel.showPasswordWarning
.asDriver()
.debug("showPasswordWarning")
.drive(onNext: { [weak self] showWarning in
UIView.animate(withDuration: 0.2) {
self?.passwordWarningLabel.isHidden = !showWarning
}
})
.addDisposableTo(disposeBag)
viewModel.credentialsValid
.debug("credentialsValid")
.drive(onNext: { [weak self] valid in
self?.signInButton.isEnabled = valid
self?.signInButton.alpha = valid ? 1 : 0.5
})
.addDisposableTo(disposeBag)
}
private func setupButtons() {
signInButton.rx.tap
.bindTo(viewModel!.signInAction)
.addDisposableTo(disposeBag)
}
}
和視圖模型:
class RxLoginViewModel {
let dataManager = DataManager.sharedInstance()
private let disposeBag = DisposeBag()
//MARK: - Model proprties
var phoneNumberText = Variable<String>("")
var passwordText = Variable<String>("")
var signInAction: Variable<Void> = Variable<Void>()
var showPhoneWarning = Variable(false)
var showPasswordWarning = Variable(false)
var credentialsValid: Driver<Bool>
var canLogIn = Variable(false)
init(phoneNumber: Driver<String>, passwordText: Driver<String>) {
let phoneValid = phoneNumber
.distinctUntilChanged()
.throttle(0.3)
.map { ($0 =~ RegEx.phone) }
let passwordValid = passwordText
.distinctUntilChanged()
.throttle(0.3)
.map { ($0.utf8.count > 5) }
credentialsValid = Driver.combineLatest(phoneValid, passwordValid) { $0 && $1 }
phoneNumber.debug("phone number driver")
.drive(onNext: {_ in self.showPhoneWarning.value = false })
.addDisposableTo(disposeBag)
phoneNumber.debug("password driver")
.drive(onNext: {_ in self.showPasswordWarning.value = false })
.addDisposableTo(disposeBag)
credentialsValid.asObservable()
.bindTo(canLogIn)
.addDisposableTo(disposeBag)
// actions handler
signInAction
.asObservable()
.debug("signInAction")
.do(onNext: { _ in
// show warning for any invalid textfield
// filter both valid fields
})
// sent url request
.subscribe(onNext: { status in
self.dataManager.login(withPhone: self.phoneNumberText.value, email: "", password: self.passwordText.value, success: { (result) in
if let response = result as? [String : Any], response["aboutMe"] == nil {
self.dataManager.currentUser().userId = response["id"] as? NSNumber
// self.dataManager.update(.fillProfile)
}
}, failure: { (error) in
// print(error.localizedDescription)
})
})
.addDisposableTo(disposeBag)
}
我應該怎麼做,以示對任何無效的文本框警告以及如何過濾在我的視圖模型都有效字段?