首页 > 解决方案 > 订阅 UITextfield(控制事件,编辑更改)

问题描述

在触发 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)
    }
}

但文本是无效的而不是字符串..

如果有人可以帮助我不胜感激。提前致谢。

PS我不想使用IBActions。

标签: iosswiftuitextfieldrx-swiftuicontrolevents

解决方案


几点:

  • 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可能会引用一些其他也必须存在的对象,并且您可能也希望能够引用其他可观察对象。

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

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

声明式代码倾向于以输出为中心,当您想知道影响标签输出的所有内容,或者导致活动指示器显示/隐藏的原因时,通常只有一个地方可以查看。但是,如果您想了解点击按钮所做的一切,则必须查看所有代码才能弄清楚。(一个完美的例子是电子表格,如果您想知道特定单元格的输出是如何定义的,您只需要查看单元格中的公式,但是如果您想知道所有受其影响的单元格一个特定的细胞,这很痛苦。)

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


推荐阅读