使用 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)