• [RxSwift教程]6、观察者2: 自定义可绑定属性


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(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 ViewControllerUIViewController {
         
        @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)运行结果如下,随着序列数的不断增长,标签文字也不断的变大。
    原文:Swift - RxSwift的使用详解6(观察者2: 自定义可绑定属性)原文:Swift - RxSwift的使用详解6(观察者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 ViewControllerUIViewController {
         
        @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 BaseUILabel {
        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 这两个可绑定属性。
    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 BaseUILabel {
         
        /// 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 ViewControllerUIViewController {
         
        @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)运行结果如下:
     
    原文:Swift - RxSwift的使用详解6(观察者2: 自定义可绑定属性)
  • 相关阅读:
    redis的数据持久化再讲 关于redisAOF RDB工作原理
    关于redis的持久化数据 RDB,AOF
    关于redis
    docker-compose的使用
    dockerfile定制镜像的使用
    docker常用命令
    关于这两天
    eclipse tomcat找不到或无法加载
    关于jdk代理和cglib代理
    scp 跨机远程拷贝
  • 原文地址:https://www.cnblogs.com/strengthen/p/13673329.html
Copyright © 2020-2023  润新知