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