ios - 订阅 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。
解决方案
几点:
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 时最难理解的事情。
推荐阅读
- php - 未定义属性:Illuminate\Pagination\LengthAwarePaginator::$id(查看:C:\xampp\htdocs\medipro55\resources\views\admin\division\index.blade.php)
- ruby - 如何使用“方法”而不是代码块来创建光纤
- facebook - 如何在 Facebook 即时游戏中删除统一内置加载屏幕?
- django - 如何使用邮递员发送嵌套的表单数据?
- javascript - 带有可选参数的javascript构造函数
- c# - 如何使用此代码添加现有的字符串数组值?
- ibm-cloud - Cloudant 仪表板未在 IBM Cloud 中启动
- python - Python 锁定鼠标和键盘
- javascript - Node js Form-data 作为中间件
- c# - 需要使用 C# 中的代码从另一个应用程序以最小化模式打开 Windows 窗体应用程序