1.1俭令、textFiled 最開(kāi)始來(lái)一次
textFiled.rx.text.subscribe(onNext: { (text) in
print("輸入來(lái)了 \(text)")
})
步驟1、點(diǎn)擊text
/// Reactive wrapper for `text` property.
public var text: ControlProperty<String?> {
return value
}
步驟2询兴、點(diǎn)擊value
controlPropertyWithDefaultEvents 方法傳入兩個(gè)閉包
/// 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
}
}
)
}
步驟3呜达、點(diǎn)擊controlPropertyWithDefaultEvents
controlPropertyWithDefaultEvents 方法有三個(gè)參數(shù)
第一個(gè)參數(shù):默認(rèn)值[.allEditingEvents, .valueChanged]
第二個(gè)參數(shù):傳入的getter閉包
第三個(gè)參數(shù):傳入的setter閉包
/// 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
)
}
步驟4抒线、點(diǎn)擊controlProperty
/// Creates a `ControlProperty` that is triggered by target/action pattern value updates.
///
/// - parameter controlEvents: Events that trigger value update sequence elements.
/// - parameter getter: Property value getter.
/// - parameter setter: Property value setter.
public func controlProperty<T>(
editingEvents: UIControl.Event,
getter: @escaping (Base) -> T,
setter: @escaping (Base, T) -> Void
) -> ControlProperty<T> {
let source: Observable<T> = Observable.create { [weak weakControl = base] observer in
guard let control = weakControl else {
observer.on(.completed)
return Disposables.create()
}
observer.on(.next(getter(control))) //最開(kāi)始來(lái)一次
let controlTarget = ControlTarget(control: control, controlEvents: editingEvents) { _ in
if let control = weakControl {
observer.on(.next(getter(control))) //之后操作的執(zhí)行
}
}
return Disposables.create(with: controlTarget.dispose)
}
.takeUntil(deallocated)
let bindingObserver = Binder(base, binding: setter)
return ControlProperty<T>(values: source, valueSink: bindingObserver)
}
步驟5缸浦、點(diǎn)擊ControlTarget
init(control: Control, controlEvents: UIControl.Event, callback: @escaping Callback) {} 初始化 ControlTarget
第一個(gè)參數(shù):control
第二個(gè)參數(shù):editingEvents -> [.allEditingEvents, .valueChanged]
第三個(gè)參數(shù):閉包 -> { _ in if let control = weakControl { observer.on(.next(getter(control))) } }
5.1夕冲、self.callback = callback 保存閉包
5.2、control.addTarget(self, action: selector, for: controlEvents) 給傳入的control添加事件 綁定#selector(ControlTarget.eventHandler(_:))方法
5.3裂逐、事件觸發(fā)是來(lái)到eventHandler歹鱼,執(zhí)行callback(control) 執(zhí)行閉包
// This should be only used from `MainScheduler`
final class ControlTarget: RxTarget {
typealias Callback = (Control) -> Void
let selector: Selector = #selector(ControlTarget.eventHandler(_:))
weak var control: Control?
#if os(iOS) || os(tvOS)
let controlEvents: UIControl.Event
#endif
var callback: Callback?
#if os(iOS) || os(tvOS)
init(control: Control, controlEvents: UIControl.Event, callback: @escaping Callback) {
MainScheduler.ensureRunningOnMainThread()
self.control = control
self.controlEvents = controlEvents
self.callback = callback
super.init()
control.addTarget(self, action: selector, for: controlEvents) // 添加事件 綁定eventHandler方法
let method = self.method(for: selector)
if method == nil {
rxFatalError("Can't find method")
}
}
@objc func eventHandler(_ sender: Control!) {
if let callback = self.callback, let control = self.control {
callback(control)
}
}
}
解決方法: skip(1)
textFiled.rx.text.skip(1).subscribe(onNext: { (text) in
print("輸入來(lái)了 \(text)")
})
1.2、textFiled text賦值卜高,subscribe閉包不走
原因 步驟3中 editingEvents: UIControl.Event = [.allEditingEvents, .valueChanged]弥姻,所以不走。這里的valueChanged是UISwitch的值改變哦
解決方法: sendActions(for: .allEditingEvents)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
textFiled.text = "Cooci"
textFiled.sendActions(for: .allEditingEvents)
}
2.1掺涛、textView 最開(kāi)始來(lái)一次
解決方法: skip(1)
textView.rx.text.skip(1).subscribe(onNext: { (text) in
print("textView:輸入來(lái)了 \(text)")
})