RxSwift textField問(wèn)題

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

2.2庭敦、textView 不存在,text賦值薪缆,subscribe閉包不走

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秧廉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拣帽,更是在濱河造成了極大的恐慌疼电,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件减拭,死亡現(xiàn)場(chǎng)離奇詭異蔽豺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拧粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)茫虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人既们,你說(shuō)我怎么就攤上這事≌玻” “怎么了啥纸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)婴氮。 經(jīng)常有香客問(wèn)我斯棒,道長(zhǎng),這世上最難降的妖魔是什么主经? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任荣暮,我火速辦了婚禮,結(jié)果婚禮上罩驻,老公的妹妹穿的比我還像新娘穗酥。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布砾跃。 她就那樣靜靜地躺著骏啰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抽高。 梳的紋絲不亂的頭發(fā)上判耕,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音翘骂,去河邊找鬼壁熄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碳竟,可吹牛的內(nèi)容都是我干的草丧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞭亮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼方仿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起统翩,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仙蚜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后厂汗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體委粉,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年娶桦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贾节。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衷畦,死狀恐怖栗涂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祈争,我是刑警寧澤斤程,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站菩混,受9級(jí)特大地震影響忿墅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沮峡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一疚脐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邢疙,春花似錦棍弄、人聲如沸望薄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)式矫。三九已至,卻和暖如春役耕,著一層夾襖步出監(jiān)牢的瞬間采转,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瞬痘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留故慈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓框全,卻偏偏與公主長(zhǎng)得像察绷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子津辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容