@dengApro 的回答非常接近。
UITextField+Rx.swift中的源码:
/// Reactive wrapper for `text` property.
public var value: ControlProperty<String?> {
return base.rx.controlPropertyWithDefaultEvents(
getter: { textField in
textField.text
},
setter: { textField, value in
// This check is important because setting text value always clears control state
// including marked text selection which is imporant for proper input
// when IME input method is used.
if textField.text != value {
textField.text = value
}
}
)
}
分配textField 一个值不能被订阅,因为controlPropertyWithDefaultEvents
UIControl+Rx.swift中的源码:
/// This is a separate method to better communicate to public consumers that
/// an `editingEvent` needs to fire for control property to be updated.
internal func controlPropertyWithDefaultEvents<T>(
editingEvents: UIControl.Event = [.allEditingEvents, .valueChanged],
getter: @escaping (Base) -> T,
setter: @escaping (Base, T) -> Void
) -> ControlProperty<T> {
return controlProperty(
editingEvents: editingEvents,
getter: getter,
setter: setter
)
}
所以只有UIControl.Event = [.allEditingEvents, .valueChanged]这两个事件是可以观察到的,
变量改变,变量绑定到 ControlProperty,ControlProperty 改变不是因为[.allEditingEvents, .valueChanged],然后完成。
ControlProperty 改变,ControlProperty 绑定到Variable,Variable 改变并绑定到ControlProperty,ControlProperty 设置不是因为[.allEditingEvents, .valueChanged],然后完成。
在controlProperty的源代码中,会建立UIControl目标--action。
[.allEditingEvents, .valueChanged] 包含editingDidBegin、editingChanged、editingDidEnd、editingDidEndOnExit、valueChanged,
所以直接分配给textField.text不会触发任何事件。