如何从用户启动和以编程方式更改UITextField
text
属性获得信号?通过使用continuousTextValues
,仅在用户启动更改时报告信号。如果以编程方式设置textField.text
,则不会触发信号。
这就是我使用continuousTextValues
的方式:
textField.reactive.continuousTextValues.observeValues { value in
print("Value: \(value)")
}
如果我手动设置text
,它不会被触发:
textField.text = "Test"
信号continuousTextValues
将仅在用户使用键盘输入时触发。您可以尝试这样做:
var characters = MutableProperty("")
tf.reactive.text <~ characters
tf.reactive.continuousTextValues.observeValues { [weak characters = characters] (text) in
characters?.value = text!
}
tf.reactive.textValues.observeValues { [weak characters = characters] (text) in
characters?.value = text!
}
characters.producer.skip(while: { $0.isEmpty }).startWithValues { (text) in
log.debug("text = \(text)")
}
characters.value = "shaw"
您不必使用textField.text
更改文本值,而是必须创建信号,将其绑定到文本字段并修改信号的值。我使用了Signal
管道但是如果你需要存储以编程方式更改的值,你可以使用MutableProperty
。
class MyViewController: UIViewController {
var textField: UITextField!
private let textFieldValuePipe = Signal<String?, NoError>.pipe()
var textFieldValueSignal: Signal<String?, NoError>!
override func viewDidLoad() {
// Initialize the text field
// ...
// Bind the text of the text field to the signal pipe's output
textField.reactive.text <~ textFieldValuePipe.output
// A signal of text values emitted by the text field upon end of editing.
let textFieldValuesSignal = textField.reactive.textValues
// A signal of text values emitted by the text field upon any changes.
let textFieldContinuousValuesSignal = textField.reactive.continuousTextValues
// Merge the relevant signals
textFieldValueSignal = Signal.merge(textFieldValuesSignal, textFieldContinuousValuesSignal, textFieldValuePipe.output)
// This will print the text field's value when it's changed by the user or programmatically
textFieldValueSignal.observeValues { value in
print(value ?? "nil")
}
}
// Use this to change the text field's value programmatically
func setTextFieldText(_ text: String?) {
textFieldValuePipe.input.send(value: text)
}
}
要收听文本属性中的程序更改:
let textField = UITextField()
let signal = textField.reactive.signal(forKeyPath: #keyPath(UITextField.text)).map { $0 as? String }
signal.observeValues { print($0) }
textField.text = "Hello World"
请注意,如果您想观察由于用户操作引起的更改,您仍需要观察continuousTextValues
。
您可以使用rac_textSignal属性监听textFields。
[self.someTextField.rac_textSignal subscribeNext:^(NSString* text) {
NSLog(@"%@", text);
}];
每次textField文本更改时,都会调用此闭包。