textField.text
でテキスト値を変更する代わりに、信号を作成し、それをテキストフィールドにバインドして信号の値を変更する必要があります。 Signal
パイプを使用しましたが、プログラムで変更された値を格納する必要がある場合は、MutableProperty
を使用できます。あなたはまだあなたがユーザのアクションによる変化を観察したい場合はcontinuousTextValues
を観察する必要が
let textField = UITextField()
let signal = textField.reactive.signal(forKeyPath: #keyPath(UITextField.text)).map { $0 as? String }
signal.observeValues { print($0) }
textField.text = "Hello World"
注:textプロパティ内のプログラム変更に耳を傾ける
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)
}
}