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

时间:2018-10-19 14:49:41

标签: ios swift uitextfield rx-swift uicontrolevents

触发UIControlEvent编辑更改后,我想使用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)
    }
}

但是文本是无效的,不是字符串。

如果有人可以帮助Id表示感谢。 预先感谢。

P.S。我不想使用IBAction。

3 个答案:

答案 0 :(得分:6)

一些要点:

  • 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时要想尽办法的最困难的事情。

答案 1 :(得分:1)

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

在后台,.text.orEmpty(是.text的别名)观察控制事件.value并返回值。

更多详细信息:

答案 2 :(得分:0)

仅当您替换UITextField本身时,才会触发UITextField上的

didSet,但当您在其上设置文本时才触发。

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