大概业务逻辑是,用户名必须>=5位才可以输入密码,并且提示语才可以隐藏,密码输入最少需要>=5位提示信息才会隐藏, 账号密码需要最少5位条件同事成立,才可以正常登录.
import UIKit
import RxSwift
import RxCocoa
class ViewController4: UIViewController {
@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!
let disposedBag = DisposeBag()
let minimalUsernameLength = 5
override func viewDidLoad() {
super.viewDidLoad()
// 定义可观察流
let usernameValid = usernameOutlet.rx.text.orEmpty
// 用户名 -> 用户名是否有效
.map {$0.characters.count >= self.minimalUsernameLength}
.share(replay: 1)
// 可观察流和对应的UI进行绑定,如果可观察流等于true 则isEnable ==
// 当用户修改用户名输入框的内容时就会产生一个新的用户名, 然后通过 map 方法将它转化成用户名是否有效, 最后通过 bind(to: ...) 来决定密码输入框是否可用以及提示语是否隐藏。
usernameValid
.bind(to: passwordOutlet.rx.isEnabled)
.disposed(by: disposedBag)
usernameValid
.bind(to: usernameValidOutlet.rx.isHidden)
.disposed(by: disposedBag)
let passwordValid = passwordOutlet.rx.text.orEmpty
// 用户密码是否有效
.map {$0.characters.count >= self.minimalUsernameLength}
.share(replay: 1)
passwordValid
.bind(to: passwordValidOutlet.rx.isHidden)
.disposed(by: disposedBag)
// 接下来就是当用户和密码都有效的时候,按钮就可以点击了
// 定义按钮的可观察流,用来用于绑定到按钮
// 通过 Observable.combineLatest(...) { ... } 来将用户名是否有效以及密码是都有效合并出两者是否同时有效,然后用它来控制绿色按钮是否可点击。
/*
combineLatest:
combineLatest就是将多个observable打包转换成我们需要的信号。
但这样有时候这种信号仍不是我们想要的,这时我们可以用map来转换一下。
zip和combineLatest有点像。区别在于combineLatest是多个信号中任何一个改变都会打包发送一次,而zip则是所有信号都发生改变之后打包发送。
举个例子,两个输入框和一个按钮,模拟用户名和密码输入。当两个的长度都大于6的时候才是有效的,并将结果绑定在按扭上。用combineLatest则是两个输入框有任何改变都会发送信号给按扭。而zip则是第一个改变了,第二个也要改变才会发送。
*/
let everythingValid = Observable.combineLatest(
usernameValid,
passwordValid
){$0 && $1}// &&取两个同事有效
.share()
everythingValid
.bind(to: doSomethingOutlet.rx.isEnabled)
.disposed(by: disposedBag)
// 接下来点击按钮点击来电反应
doSomethingOutlet.rx.tap
.subscribe({_ in showAlert()})
.disposed(by: disposedBag)
func showAlert(){
let alertView = UIAlertView(
title: "登录成功",
message: "恭喜看到了RxSwift的神奇效果!!",
delegate: nil,
cancelButtonTitle: "OK"
)
alertView.show()
}
}
}
在开发中如果使用原生的api实现功能的话需要需要的代码量很多,写到你不想写,这里就看到了RxSwift的牛逼之处了吧!
网友评论