將值域與控件域一同提高爲rx的monand域,而後進行綁定。html
類型提高。swift
在以前的文章樣例中,全部的綁定都是單向的。但有時候咱們須要實現雙向綁定。好比將控件的某個屬性值與 ViewModel
裏的某個 Subject
屬性進行雙向綁定:ide
ViewModel
裏的值發生改變時,能夠同步反映到控件上。ViewModel
那邊值同時也會發生變化。(1)頁面上方是一個文本輸入框,用於填寫用戶名。它與 VM
裏的 username
屬性作雙向綁定。ui
(2)下方的文本標籤會根據用戶名顯示對應的用戶信息。(只有 hangge顯示管理員,其它都是訪客)spa
(1)首先定義一個 VM
,代碼以下:3d
import RxSwift struct UserViewModel { //用戶名 let username = Variable("guest") //用戶信息 lazy var userinfo = { return self.username.asObservable() .map{ $0 == "hangge" ? "您是管理員" : "您是普通訪客" } .share(replay: 1) }() }
(2)頁面代碼以下(高亮部分爲 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) } }
(1)若是常常進行雙向綁定的話,最好仍是自定義一個 operator
方便使用。code
(2)好在 RxSwift
項目文件夾中已經有個現成的(Operators.swift
),咱們將它複製到咱們項目中便可使用。固然如咱們想本身寫一些其它的雙向綁定 operator
也能夠參考它。orm
雙向綁定操做符是:<->
。咱們修改上面樣例,能夠發現代碼精簡了許多。htm
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) } }