RxSwift學習筆記5:Binder

使用 Binder 建立觀察者

        //Observable序列(每隔1秒鐘發出一個索引數)
        let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        
        let blinderObserval:Binder<String> = Binder(label){view,text in
            view.text = text
        }

        scheduleObservable
            .map{"當前索引\($0)"}
            .bind(to: blinderObserval)
            .disposed(by: disposeBag)

  

自定義可綁定屬性

//有時咱們想讓 UI 控件建立出來後默認就有一些觀察者,而沒必要每次都爲它們單獨去建立觀察者。
//好比咱們想要讓全部的 UIlabel 都有個 fontSize 可綁定屬性,它會根據事件值自動改變標籤的字體大小。

//這裏咱們經過對 UILabel 進行擴展,增長了一個 fontSize 可綁定屬性。 extension UILabel{ public var fontSize:Binder<CGFloat>{ return Binder(self){label,fontSize in label.font = UIFont.systemFont(ofSize: fontSize) } } }
//經過對 Reactive 類進行擴展
 //既然使用了 RxSwift,那麼更規範的寫法應該是對 Reactive 進行擴展。
 //這裏一樣是給 UILabel 增長了一個 fontSize 可綁定屬性。(注意:這種方式下,咱們綁定屬性時要寫成 label.rx.fontSize)
extension Reactive where Base:UILabel{
    public var fontSize:Binder<CGFloat>{
        return Binder(self.base){label,fontSize in
            label.font = UIFont.systemFont(ofSize: fontSize)
        }
    }
}
//Observable序列(每隔1秒鐘發出一個索引數)
let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        
        
/*
 有時咱們想讓 UI 控件建立出來後默認就有一些觀察者,而沒必要每次都爲它們單獨去建立觀察者。
好比咱們想要讓全部的 UIlabel 都有個 fontSize 可綁定屬性,它會根據事件值自動改變標籤的字體大小。
*/
        
 scheduleObservable
    .map{ CGFloat($0) }
    .bind(to: label.fontSize)
    .disposed(by:disposeBag)
        
scheduleObservable.map{CGFloat($0)}
   .bind(to: label.rx.fontSize)
   .disposed(by: disposeBag)         

 

RxSwift 自帶的可綁定屬性(UI 觀察者)

    override func viewDidLoad() {
        super.viewDidLoad()

        //Observable序列(每隔1秒鐘發出一個索引數)
        let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)

        
        /*
        //其實 RxSwift 已經爲咱們提供許多經常使用的可綁定屬性。好比 UILabel 就有 text 和 attributedText 這兩個可綁定屬性。
        import RxSwift
        import UIKit
        
        extension Reactive where Base: UILabel {
         
            /// Bindable sink for `text` property.
            public var text: Binder<String?> {
                return Binder(self.base) { label, text in
                    label.text = text
                }
            }
         
            /// Bindable sink for `attributedText` property.
            public var attributedText: Binder<NSAttributedString?> {
                return Binder(self.base) { label, text in
                    label.attributedText = text
                }
            }
         }
         */
        //RxSwift 自帶的可綁定屬性(UI 觀察者)
        scheduleObservable
            .map{"當前索引\($0)"}
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
        
        scheduleObservable
            .map {$0 % 2 == 0}
            .bind(to: mbutton.rx.isEnabled)
            .disposed(by: disposeBag)
        
    }

 

Binder 在 RxCocoa 中的應用

        //其實 RxCocoa 在對許多 UI 控件進行擴展時,就利用 Binder 將控件屬性變成觀查者
        //好比 UIControl+Rx.swift 中的 isEnabled 屬性即是一個 observer :
        let schedulerObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        //在 bind 方法中建立
        schedulerObserval
            .map {
                "當前索引:\($0)" //返回字符串
            }
            .bind {(value) in
                //action
                
                print(value)
            }
            .disposed(by: disposeBag)    
相關文章
相關標籤/搜索