在 UITextfield 上订阅(控制事件,编辑已更改)

Subscribing On UITextfield (Control event, Editing changed)

我想在触发 UIControlEvent Editing Changed 后使用 RxSwift 从 UITextField 获取文本。

为了做到这一点:

我就这样将情节提要中的文本字段出口连接到我的视图控制器。

@IBOutlet weak var currentPasswordTextField: UITextField!

然后在这个文本字段的 didSet 属性 上我尝试了这个:

@IBOutlet weak var currentPasswordTextField: UITextField!{
    didSet{
        currentPasswordTextField
            .rx
            .controlEvent(.editingChanged)
            .asObservable()
            .subscribe(onNext: { (text) in
            //I want here to print the text after the editing changed. 
               print(text)
            })
            .disposed(by: disposeBag)
    }
}

但文本是 Void 而不是字符串..

如果有人能帮助我,我将不胜感激。 提前致谢。

P.S。我不想使用 IBActions。

您想订阅 currentPasswordTextField.rx. text(如果您不想要可选字符串,则订阅 .text.orEmpty)而不是控制事件本身。

在幕后,.text(这是 .value 的别名)观察控制事件 [.allEditingEvents, .valueChanged] 和 returns 值。

更多详情:

UITextField 上的 didSet 仅在您替换 UITextField 本身时触发,但在您设置文本时不会触发。

// Does not trigger didSet :
self.currentPasswordTextField.text = "text"
// Does trigger didSet
self.currentPasswordTextField = UITextField()

几点:

  • asObservable() 是不必要的。
  • 您可以直接订阅 .rx.text.orEmpty,但是您会在文本字段开始和结束编辑时收到事件。

给你:

@IBOutlet weak var currentPasswordTextField: UITextField!{
    didSet{
        currentPasswordTextField
            .rx
            .controlEvent(.editingChanged)
            .withLatestFrom(currentPasswordTextField.rx.text.orEmpty)
            .subscribe(onNext: { (text) in
                //I want here to print the text after the editing changed.
                print(text)
            })
            .disposed(by: disposeBag)
    }
}

我昨晚想到的其他事情...

将此代码放在 didSet 中将是一个问题。 Rx 代码倾向于以输出为中心,而不是以输入为中心。因此,subscribe 中的任何内容都可能会引用其他一些也必须存在的对象,并且您可能也希望能够引用其他可观察对象。

以输入为中心与以输出为中心是什么意思?

命令式代码往往以输入为中心,当您想知道点击按钮时会发生什么时,通常只有一个地方可以查看,即按钮的操作。但是,如果您想了解影响特定标签、activity 指标或任何其他输出的所有内容,您必须通读所有代码。视图控制器中的每个函数都可以将信息推送到输出,其中几个可能是。

声明性代码往往以输出为中心,当您想了解影响标签输出的所有内容,或者是什么导致 activity 指标变为 [=44= 】,一般只有一个地方可以看。但是,如果您想了解点击按钮所做的一切,则必须通读所有代码才能搞清楚。 (一个完美的例子是电子表格,如果你想知道特定单元格的输出是如何定义的,你只需要查看 that 单元格中的公式,但如果你想知道受特定细胞影响的所有细胞,这很痛苦。)

根据我的经验,以上是程序员在使用 Rx 时最难思考的事情。