Last updated
class SimpleValidationViewController : ViewController {
@IBOutlet weak var usernameOutlet: UITextField!
@IBOutlet weak var usernameValidOutlet: UILabel!
@IBOutlet weak var passwordOutlet: UITextField!
@IBOutlet weak var passwordValidOutlet: UILabel!
@IBOutlet weak var doSomethingOutlet: UIButton!
...
}override func viewDidLoad() {
super.viewDidLoad()
...
// 用户名是否有效
let usernameValid = usernameOutlet.rx.text.orEmpty
// 用户名 -> 用户名是否有效
.map { $0.count >= minimalUsernameLength }
.share(replay: 1)
...
// 用户名是否有效 -> 密码输入框是否可用
usernameValid
.bind(to: passwordOutlet.rx.isEnabled)
.disposed(by: disposeBag)
// 用户名是否有效 -> 用户名提示语是否隐藏
usernameValid
.bind(to: usernameValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
...
}override func viewDidLoad() {
super.viewDidLoad()
...
// 密码是否有效
let passwordValid = passwordOutlet.rx.text.orEmpty
// 密码 -> 密码是否有效
.map { $0.count >= minimalPasswordLength }
.share(replay: 1)
...
// 密码是否有效 -> 密码提示语是否隐藏
passwordValid
.bind(to: passwordValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
...
}override func viewDidLoad() {
super.viewDidLoad()
...
// 用户名是否有效
let usernameValid = ...
// 密码是否有效
let passwordValid = ...
...
// 所有输入是否有效
let everythingValid = Observable.combineLatest(
usernameValid,
passwordValid
) { $0 && $1 } // 取用户名和密码同时有效
.share(replay: 1)
...
// 所有输入是否有效 -> 绿色按钮是否可点击
everythingValid
.bind(to: doSomethingOutlet.rx.isEnabled)
.disposed(by: disposeBag)
...
}override func viewDidLoad() {
super.viewDidLoad()
...
// 点击绿色按钮 -> 弹出提示框
doSomethingOutlet.rx.tap
.subscribe(onNext: { [weak self] in self?.showAlert() })
.disposed(by: disposeBag)
}
func showAlert() {
let alertView = UIAlertView(
title: "RxExample",
message: "This is wonderful",
delegate: nil,
cancelButtonTitle: "OK"
)
alertView.show()
}override func viewDidLoad() {
super.viewDidLoad()
usernameValidOutlet.text = "Username has to be at least \(minimalUsernameLength) characters"
passwordValidOutlet.text = "Password has to be at least \(minimalPasswordLength) characters"
let usernameValid = usernameOutlet.rx.text.orEmpty
.map { $0.count >= minimalUsernameLength }
.share(replay: 1)
let passwordValid = passwordOutlet.rx.text.orEmpty
.map { $0.count >= minimalPasswordLength }
.share(replay: 1)
let everythingValid = Observable.combineLatest(
usernameValid,
passwordValid
) { $0 && $1 }
.share(replay: 1)
usernameValid
.bind(to: passwordOutlet.rx.isEnabled)
.disposed(by: disposeBag)
usernameValid
.bind(to: usernameValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
passwordValid
.bind(to: passwordValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
everythingValid
.bind(to: doSomethingOutlet.rx.isEnabled)
.disposed(by: disposeBag)
doSomethingOutlet.rx.tap
.subscribe(onNext: { [weak self] in self?.showAlert() })
.disposed(by: disposeBag)
}
func showAlert() {
let alertView = UIAlertView(
title: "RxExample",
message: "This is wonderful",
delegate: nil,
cancelButtonTitle: "OK"
)
alertView.show()
}