4

ユーザーが開始した変更とプログラムによって変更された変更の両方から信号を取得するにはUITextFieldtextプロパティを使用しますか? continuousTextValuesを使用すると、ユーザーが変更を開始したときにのみ信号が報告されます。 textField.textをプログラムで設定すると、信号は発生しません。ReactiveCocoa 5のUITextFieldテキストプロパティが変更されるたびに信号を取得する方法

これは私がcontinuousTextValuesを使用している方法です:

textField.reactive.continuousTextValues.observeValues { value in 
    print("Value: \(value)") 
} 

私は手動でtextを設定した場合、それがトリガーされません。

textField.text = "Test" 

答えて

4

をユーザ入力が使用している間、信号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" 
1

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) 
    } 

} 
関連する問題