rxswift的雙向綁定

將值域與控件域一同提高爲rx的monand域,而後進行綁定。html

類型提高。swift

 

在以前的文章樣例中,全部的綁定都是單向的。但有時候咱們須要實現雙向綁定。好比將控件的某個屬性值與 ViewModel裏的某個 Subject屬性進行雙向綁定:ide

  • 這樣當 ViewModel裏的值發生改變時,能夠同步反映到控件上。
  • 而若是對控件值作修改,ViewModel那邊值同時也會發生變化。

1、簡單的雙向綁定

1,效果圖

(1)頁面上方是一個文本輸入框,用於填寫用戶名。它與 VM裏的 username屬性作雙向綁定。ui

(2)下方的文本標籤會根據用戶名顯示對應的用戶信息。(只有 hangge顯示管理員,其它都是訪客)spa

 
 

 

 
 

2,樣例代碼

(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) } } 

2、自定義雙向綁定操做符(operator)

1,RxSwift 自帶的雙向綁定操做符

(1)若是常常進行雙向綁定的話,最好仍是自定義一個 operator方便使用。code

(2)好在 RxSwift項目文件夾中已經有個現成的(Operators.swift),咱們將它複製到咱們項目中便可使用。固然如咱們想本身寫一些其它的雙向綁定 operator也能夠參考它。orm

 
 

2,使用樣例

雙向綁定操做符是:<->。咱們修改上面樣例,能夠發現代碼精簡了許多。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) } } 

RxSwift使用詳解系列
原文出自:www.hangge.com轉載請保留原文連接



做者:八級大狂風AM
連接:https://www.jianshu.com/p/39fb6a65ec91
來源:簡書
簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
 
http://www.hangge.com/blog/cache/detail_1929.html
相關文章
相關標籤/搜索