RxSwift:Driver與UI控制元件初體驗
阿新 • • 發佈:2018-11-10
輸入電話號碼的區號和八位數主體號碼,下面的Label實時更新最新的輸入,如果區號為3位數,點選按鈕,按鈕名字變成“變!”
Ps:目前還不會,同時滿足上面兩位,下面三位的的約束,以後會更新的
檔名:ViewController.swift
// // ViewController.swift // RxSwiftTest // // Created by travey on 2018/11/5. // Copyright © 2018年 ZhouShijie. All rights reserved. // import UIKit import RxSwift import RxCocoa import SnapKit class ViewController: UIViewController { var textField1: UITextField! var textField2: UITextField! var label: UILabel! var btn: UIButton! let disposeBag = DisposeBag() override func viewDidLoad() { textField1 = UITextField() textField2 = UITextField() label = UILabel() btn = UIButton() textField1.layer.borderWidth = 1 textField2.layer.borderWidth = 1 label.textAlignment = .center btn.setTitle("點我", for: .normal) btn.layer.borderWidth = 1 btn.setTitleColor(UIColor.black, for: .normal) view.addSubview(textField1) view.addSubview(textField2) view.addSubview(label) view.addSubview(btn) textField1.snp.makeConstraints { (make) in make.centerX.equalToSuperview() make.top.equalToSuperview().offset(200) make.height.equalTo(30) make.width.equalTo(200) } textField2.snp.makeConstraints { (make) in make.centerX.equalToSuperview() make.top.equalTo(textField1.snp.bottom).offset(30) make.height.equalTo(30) make.width.equalTo(200) } label.snp.makeConstraints { (make) in make.centerX.equalToSuperview() make.top.equalTo(textField2.snp.bottom).offset(30) make.height.equalTo(30) make.width.equalTo(500) } btn.snp.makeConstraints { (make) in make.centerX.equalToSuperview() make.top.equalTo(label.snp.bottom).offset(30) make.height.equalTo(30) make.width.equalTo(40) } Observable.combineLatest(textField1.rx.text.orEmpty, textField2.rx.text.orEmpty){ "你輸入的電話號碼是\($0)-\($1)" } .asDriver(onErrorJustReturn: "") .drive(label.rx.text) .disposed(by: disposeBag) textField1.rx.text.orEmpty.asObservable().asDriver(onErrorJustReturn: "") .map{ $0.count == 3 } .drive(btn.rx.isEnabled) .disposed(by: disposeBag) btn.rx.tap .subscribe(onNext: { [weak self] in self?.btn.setTitle("變!", for: .normal) }) .disposed(by: disposeBag) } }