【问题标题】:Observing UITextField.editing with RxSwift使用 RxSwift 观察 UITextField.editing
【发布时间】:2017-01-30 08:19:12
【问题描述】:

我想观察属性UITextfield.editing。我正在使用此代码:

self.money.rx_observe(Bool.self, "editing").subscribeNext { (value) in
    print("")
}.addDisposableTo(disposeBag)

但是在运行的过程中,只执行了一次。请问这个怎么解决啊

【问题讨论】:

    标签: ios swift rx-swift reactivex rx-cocoa


    【解决方案1】:

    从 RxSwift 4.0 开始,有两个具体的控制事件:textDidBeginEditingtextDidEndEditing

    你可以这样使用它:

    textField.rx.textDidEndEditing
                .asObservable()
                .subscribe(onNext: {
                    print("End of edition")
                }).disposed(by: disposeBag)
    
    
    textField.rx.textDidBeginEditing
                    .asObservable()
                    .subscribe(onNext: {
                        print("Start of edition")
                    }).disposed(by: disposeBag)
    

    【讨论】:

    • 这是 UISearchBar 的事件,不适用于 UITextField
    • 是的。这是针对UISearchBar 事件的。谢谢。
    【解决方案2】:

    不要观察editing 属性,因为它不仅仅是一个存储属性。定义为:

    public var editing: Bool { get }
    

    所以你不知道 UIKit 实际上是如何获得这个价值的。

    改为使用rx.controlEvent 并指定您感兴趣的控制事件,如下所示:

    textField.rx.controlEvent([.editingDidBegin, .editingDidEnd])
        .asObservable()
        .subscribe(onNext: { _ in
            print("editing state changed")
        })
        .disposed(by: disposeBag)
    

    【讨论】:

      【解决方案3】:

      对于 RXSwift 3.0

      textField.rx.controlEvent([.editingDidBegin,.editingDidEnd])
              .asObservable()
              .subscribe(onNext: {
                  print("editing state changed")
              }).disposed(by: disposeBag)
      

      【讨论】:

      • 但是在这种情况下,您无法区分发生了哪些事件。对于 Swift 4.x 也可以。
      • 这是一个选项集,因此您可以具体如.rx.controlEvent(.editingDidEnd)
      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多