mapanguan

导航

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)    

  

  

posted on 2018-07-02 11:04  mapanguan  阅读(644)  评论(0编辑  收藏  举报