在 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 时最难思考的事情。
我想在触发 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 时最难思考的事情。