使用 RxSwift 观察 UITextField.editing

问题描述 投票:0回答:4

我想观察房产

UITextfield.editing
。我正在使用这个代码:

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

但在运行过程中,只执行一次。请问如何解决这个问题

ios swift rx-swift reactivex rx-cocoa
4个回答
55
投票

不要观察

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)

16
投票

对于RXSwift 3.0

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

3
投票

从 RxSwift 4.0 开始,有两个特定的控制事件:

textDidBeginEditing
textDidEndEditing

你可以这样使用它:

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)

0
投票

使用最新的 Rxswift,您可以将其用作:

yourTextField
        .rx
        .controlEvent(.editingDidEnd) // you can also use other controlEvents
        .withLatestFrom(yourTextField.rx.text)
        .observe(on: MainScheduler.instance)
        .subscribe { [weak self] text in
            guard let self = self else { return }
            print("when editing didEnd, my text is \(text)"
        }
        .disposed(by: disposeBag)

通过使用 .withLatestFrom,您还可以获得根据您定义的 controlEvent 编写的时间文本。

© www.soinside.com 2019 - 2024. All rights reserved.