4

Как вы получаете сигнал от инициированных пользователем и программно внесенных изменений в UITextFieldtext? При использовании continuousTextValues передается только сигнал, когда пользователь инициировал изменение. Если программным способом установить textField.text, сигнал не срабатывает.Как вы получаете сигнал каждый раз, когда свойство текста UITextField изменяется в ReactiveCocoa 5

Это, как я использую 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.

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

} 
0

Для прослушивания программных изменений в текст собственности:

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, если вы хотите, чтобы наблюдать изменения, связанные с действиями пользователя.

 Смежные вопросы

  • Нет связанных вопросов^_^