★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
强烈推荐!!!试用博主个人App作品!提需求!提建议!
App Store搜索:【Mind Draft】
中国区可直接点击跳转:【Mind Draft】
五、自定义可绑定属性
有时我们想让 UI 控件创建出来后默认就有一些观察者,而不必每次都为它们单独去创建观察者。比如我们想要让所有的 UIlabel 都有个 fontSize 可绑定属性,它会根据事件值自动改变标签的字体大小。
方式一:通过对 UI 类进行扩展
(1)这里我们通过对 UILabel 进行扩展,增加了一个 fontSize 可绑定属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import UIKit import RxSwift import RxCocoa class ViewController : UIViewController { @IBOutlet weak var label: UILabel ! let disposeBag = DisposeBag () override func viewDidLoad() { //Observable序列(每隔0.5秒钟发出一个索引数) let observable = Observable < Int >.interval(0.5, scheduler: MainScheduler .instance) observable . map { CGFloat ($0) } .bind(to: label.fontSize) //根据索引数不断变放大字体 .disposed(by: disposeBag) } } extension UILabel { public var fontSize: Binder < CGFloat > { return Binder ( self ) { label, fontSize in label.font = UIFont .systemFont(ofSize: fontSize) } } } |
(2)运行结果如下,随着序列数的不断增长,标签文字也不断的变大。
方式二:通过对 Reactive 类进行扩展
既然使用了 RxSwift,那么更规范的写法应该是对 Reactive 进行扩展。这里同样是给 UILabel 增加了一个 fontSize 可绑定属性。
(注意:这种方式下,我们绑定属性时要写成 label.rx.fontSize)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import UIKit import RxSwift import RxCocoa class ViewController : UIViewController { @IBOutlet weak var label: UILabel ! let disposeBag = DisposeBag () override func viewDidLoad() { //Observable序列(每隔0.5秒钟发出一个索引数) let observable = Observable < Int >.interval(0.5, scheduler: MainScheduler .instance) observable . map { CGFloat ($0) } .bind(to: label.rx.fontSize) //根据索引数不断变放大字体 .disposed(by: disposeBag) } } extension Reactive where Base : UILabel { public var fontSize: Binder < CGFloat > { return Binder ( self .base) { label, fontSize in label.font = UIFont .systemFont(ofSize: fontSize) } } } |
六、RxSwift 自带的可绑定属性(UI 观察者)
(1)其实 RxSwift 已经为我们提供许多常用的可绑定属性。比如 UILabel 就有 text 和 attributedText 这两个可绑定属性。
(2)那么上文那个定时显示索引数的样例,我们其实不需要自定义 UI 观察者,直接使用 RxSwift 提供的绑定属性即可。
(3)运行结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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 } } } |
(2)那么上文那个定时显示索引数的样例,我们其实不需要自定义 UI 观察者,直接使用 RxSwift 提供的绑定属性即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import UIKit import RxSwift import RxCocoa class ViewController : UIViewController { @IBOutlet weak var label: UILabel ! let disposeBag = DisposeBag () override func viewDidLoad() { //Observable序列(每隔1秒钟发出一个索引数) let observable = Observable < Int >.interval(1, scheduler: MainScheduler .instance) observable . map { "当前索引数:($0 )" } .bind(to: label.rx.text) //收到发出的索引数后显示到label上 .disposed(by: disposeBag) } } |
(3)运行结果如下: