RxSwift 實(shí)踐(二)基本常用控件(UILabel、UIButton抵乓、UITextField)

RxCocoa 是讓 Cocoa APIs 更容易使用響應(yīng)式編程的一個(gè)框架伴挚。RxCocoa 能夠讓我們方便地進(jìn)行響應(yīng)式網(wǎng)絡(luò)請(qǐng)求、響應(yīng)式的用戶(hù)交互灾炭、綁定數(shù)據(jù)模型到 UI 控件等等茎芋。而且大多數(shù)的 UIKit 控件都有響應(yīng)式擴(kuò)展,它們都是通過(guò) rx 屬性進(jìn)行使用蜈出。
demo下載

UILabel

用計(jì)時(shí)器的時(shí)間綁定到label上

    let timer = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
    timer.map {  String(format: "%0.2d:%0.2d:%0.1d", arguments: [($0 / 600) % 600, ($0 % 600 ) / 10, $0 % 10])       }
        .bind(to: label.rx.text)
        .disposed(by: disposeBag)

UIButton

  • 按鈕的點(diǎn)擊事件
    button.rx.tap
        .subscribe(onNext:{ [weak self] in
            self?.showMessage(text: "按鈕被點(diǎn)擊啦")
        })
        .disposed(by: disposeBag)
  • 按鈕的title和image進(jìn)行綁定
    //綁定title
    let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    timer.map { "\($0)"     }
        .bind(to: button.rx.title(for: .normal))
        .disposed(by: disposeBag)
        
    //綁定image(綁定backgroundImage也是一樣的)
    let timer2 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    timer2.map{
        let imageName = ( $0 % 2 == 0 ? "navBack1" : "navBack3" )
        return UIImage.init(named: imageName)!
    }
        .bind(to: button.rx.image())
        .disposed(by:disposeBag)
  • 按鈕的選中事件.
    例子:當(dāng)其中1個(gè)按鈕選中的時(shí)候田弥,將另外2個(gè)選中取消
   //將按鈕放入數(shù)組中,并進(jìn)行強(qiáng)制解包
   let buttons = [button1,button2,button3].map({$0!})
   button1.isSelected = true
   
   //創(chuàng)建一個(gè)可觀察序列铡原,它可以發(fā)送最后一次點(diǎn)擊的按鈕(也就是我們需要選中的按鈕)
   let selectButton = Observable.from(buttons.map({button in button.rx.tap.map{return button}}))
                                .merge()

   //遍歷按鈕對(duì)selectedButton進(jìn)行訂閱偷厦,根據(jù)它是否是當(dāng)前選中的按鈕綁定isSelected屬性
   for btn in buttons {
       selectButton.map {$0 == btn}
       .bind(to: btn.rx.isSelected)
       .disposed(by: disposeBag)
   }
  • 按鈕是否可用
    將UISwitch開(kāi)關(guān)事件綁定和UIButton是否可使用進(jìn)行綁定
switchs.rx.isOn.bind(to: button1.rx.isEnabled)
                .disposed(by: disposeBag)

UISwitch

開(kāi)關(guān)狀態(tài)

    switchs.rx.isOn.asObservable()
        .subscribe(onNext:{[weak self]
            print("開(kāi)關(guān)狀態(tài):\($0)")
            self.button2.isEnabled = $0
        })
        .disposed(by: disposeBag)

UITextField

  • textField的值改變
    textField1.rx.text.orEmpty.asObservable()
        .subscribe(onNext:{
            print($0)
        })
        .disposed(by: disposeBag)
  • 將textField的值綁定到其他UI控件上
    //文本框的變化序列
    let tfInput = textField1.rx.text.orEmpty.asDriver()
                            .throttle(0.5)
    
    //將內(nèi)容綁定到另外一個(gè)輸入框
    tfInput.drive(textField2.rx.text)
        .disposed(by: disposeBag)
    
    //將內(nèi)容綁定到label
    tfInput.map({String(format: "當(dāng)前輸入了%ld個(gè)字", $0.count)})
        .drive(label.rx.text)
        .disposed(by: disposeBag)
    
    //將內(nèi)容綁定到button 但輸入超過(guò)5個(gè)才可以點(diǎn)擊
    tfInput.map({ $0.count > 5 })
        .drive(button.rx.isEnabled)
        .disposed(by: disposeBag)
  • 同時(shí)監(jiān)聽(tīng)兩個(gè)textField
    //同事監(jiān)聽(tīng)兩個(gè)textField
    Observable.combineLatest(textField1.rx.text.orEmpty,textField2.rx.text.orEmpty){
        text1,text2 -> String in
        return String(format: "前1個(gè)值:%@, 后1個(gè)值:%@",text1,text2)
    }
        .map({$0})
        .bind(to: totalLabel.rx.text)
        .disposed(by: disposeBag)

事件監(jiān)聽(tīng)
通過(guò) rx.controlEvent 可以監(jiān)聽(tīng)輸入框的各種事件,且多個(gè)事件狀態(tài)可以自由組合燕刻。

  • editingDidBegin:開(kāi)始編輯(開(kāi)始輸入內(nèi)容)
  • editingChanged:輸入內(nèi)容發(fā)生改變
  • editingDidEnd:結(jié)束編輯
  • editingDidEndOnExit:按下 return 鍵結(jié)束編輯
  • allEditingEvents:包含前面的所有編輯相關(guān)事件
    //監(jiān)聽(tīng)textField的回車(chē)事件
    textField1.rx.controlEvent(.editingDidEndOnExit)
        .subscribe(onNext:{ [weak self] in
            self?.textField2.becomeFirstResponder()
        })
        .disposed(by: disposeBag)
    
    //監(jiān)聽(tīng)textField的所有事件
    textField2.rx.controlEvent(.allEditingEvents)
        .subscribe(onNext:{
            print("正再監(jiān)聽(tīng)所以輸入事件")
        })
        .disposed(by: disposeBag)

UITextView

UITextView 還封裝了如下幾個(gè)委托回調(diào)方法:

  • didBeginEditing:開(kāi)始編輯
  • didEndEditing:結(jié)束編輯
  • didChange:編輯內(nèi)容發(fā)生改變
  • didChangeSelection:選中部分發(fā)生變化
    textView.rx.didBeginEditing
        .subscribe(onNext:{
            print("開(kāi)始編輯")
        })
        .disposed(by: disposeBag)
    
    textView.rx.didEndEditing
        .subscribe(onNext:{
            print("結(jié)束編輯")
        })
        .disposed(by: disposeBag)

    textView.rx.didChange
        .subscribe(onNext:{
            print("內(nèi)容變了")
        })
        .disposed(by: disposeBag)

    textView.rx.didChangeSelection
        .subscribe(onNext:{
            print("選擇內(nèi)容發(fā)生變化")
        })
        .disposed(by: disposeBag)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末只泼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卵洗,更是在濱河造成了極大的恐慌请唱,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件过蹂,死亡現(xiàn)場(chǎng)離奇詭異十绑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)榴啸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)孽惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鸥印,你說(shuō)我怎么就攤上這事勋功。” “怎么了库说?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵狂鞋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我潜的,道長(zhǎng)骚揍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮信不,結(jié)果婚禮上嘲叔,老公的妹妹穿的比我還像新娘。我一直安慰自己抽活,他們只是感情好硫戈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著下硕,像睡著了一般丁逝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梭姓,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天霜幼,我揣著相機(jī)與錄音,去河邊找鬼誉尖。 笑死罪既,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铡恕。 我是一名探鬼主播萝衩,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼没咙!你這毒婦竟也來(lái)了猩谊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祭刚,失蹤者是張志新(化名)和其女友劉穎牌捷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涡驮,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暗甥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捉捅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撤防。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棒口,靈堂內(nèi)的尸體忽然破棺而出寄月,到底是詐尸還是另有隱情,我是刑警寧澤无牵,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布漾肮,位于F島的核電站,受9級(jí)特大地震影響茎毁,放射性物質(zhì)發(fā)生泄漏克懊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谭溉。 院中可真熱鬧墙懂,春花似錦、人聲如沸扮念。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扔亥。三九已至,卻和暖如春谈为,著一層夾襖步出監(jiān)牢的瞬間旅挤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工伞鲫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粘茄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓秕脓,卻偏偏與公主長(zhǎng)得像柒瓣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吠架,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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