zoukankan      html  css  js  c++  java
  • 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)    
    

      

      

  • 相关阅读:
    PHP“Cannot use object of type stdClass as array”
    JS简单循环遍历json数组的方法
    省市区、民族下拉列表框
    java 代码获取视频时长
    CentOs 相关
    曾经遇过的sql问题
    在线分享代码
    ssm 数据库连接池配置
    代码片段
    java 常见问题
  • 原文地址:https://www.cnblogs.com/mapanguan/p/9252861.html
Copyright © 2011-2022 走看看