? ? ? ? 在之前的文章樣例中,所有的綁定都是單向的博投。但有時(shí)候我們需要實(shí)現(xiàn)雙向綁定里烦。比如將控件的某個(gè)屬性值與 ViewModel
里的某個(gè) Subject
屬性進(jìn)行雙向綁定:
- 這樣當(dāng)
ViewModel
里的值發(fā)生改變時(shí)际插,可以同步反映到控件上哼审。 - 而如果對(duì)控件值做修改谐腰,
ViewModel
那邊值同時(shí)也會(huì)發(fā)生變化。
一涩盾、簡(jiǎn)單的雙向綁定
1十气,效果圖
(1)頁(yè)面上方是一個(gè)文本輸入框,用于填寫(xiě)用戶名旁赊。它與 VM
里的 username
屬性做雙向綁定桦踊。
(2)下方的文本標(biāo)簽會(huì)根據(jù)用戶名顯示對(duì)應(yīng)的用戶信息椅野。(只有 hangge 顯示管理員终畅,其它都是訪客)
2,樣例代碼
(1)首先定義一個(gè) VM
竟闪,代碼如下:
import RxSwift
struct UserViewModel {
//用戶名
let username = Variable("guest")
//用戶信息
lazy var userinfo = {
return self.username.asObservable()
.map{ $0 == "hangge" ? "您是管理員" : "您是普通訪客" }
.share(replay: 1)
}()
}
(2)頁(yè)面代碼如下(高亮部分為 textfield
與 VM
的雙向綁定):
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var label: UILabel!
var userVM = UserViewModel()
let disposeBag = DisposeBag()
override func viewDidLoad() {
//將用戶名與textField做雙向綁定
userVM.username.asObservable().bind(to: textField.rx.text).disposed(by: disposeBag)
textField.rx.text.orEmpty.bind(to: userVM.username).disposed(by: disposeBag)
//將用戶信息綁定到label上
userVM.userinfo.bind(to: label.rx.text).disposed(by: disposeBag)
}
}
二离福、自定義雙向綁定操作符(operator)
1,RxSwift 自帶的雙向綁定操作符
(1)如果經(jīng)常進(jìn)行雙向綁定的話炼蛤,最好還是自定義一個(gè) operator
方便使用妖爷。
(2)好在 RxSwift
項(xiàng)目文件夾中已經(jīng)有個(gè)現(xiàn)成的(Operators.swift
),我們將它復(fù)制到我們項(xiàng)目中即可使用。當(dāng)然如我們想自己寫(xiě)一些其它的雙向綁定 operator
也可以參考它絮识。
2绿聘,使用樣例
雙向綁定操作符是:<->
。我們修改上面樣例次舌,可以發(fā)現(xiàn)代碼精簡(jiǎn)了許多熄攘。
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var label: UILabel!
var userVM = UserViewModel()
let disposeBag = DisposeBag()
override func viewDidLoad() {
//將用戶名與textField做雙向綁定
_ = self.textField.rx.textInput <-> self.userVM.username
//將用戶信息綁定到label上
userVM.userinfo.bind(to: label.rx.text).disposed(by: disposeBag)
}
}