触发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。
答案 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)
didSet,但当您在其上设置文本时才触发。
// Does not trigger didSet :
self.currentPasswordTextField.text = "text"
// Does trigger didSet
self.currentPasswordTextField = UITextField()