RxSwift---簡(jiǎn)單實(shí)戰(zhàn)(四)

經(jīng)過(guò)前面三篇文章的探索方仿,我們對(duì)RxSwift的原理有了一定的認(rèn)知户敬,正所謂所有的理論基礎(chǔ)都是為實(shí)踐作鋪墊的际长,那么今天我們就來(lái)進(jìn)行一些RxSwift在項(xiàng)目中的實(shí)際運(yùn)用

概況

今天準(zhǔn)備了下圖中的一些UI控件熙参,根據(jù)實(shí)際開(kāi)發(fā)中遇到的需求馍迄,使用RxSwift完成這些需求

需求一

  • 出生日期不能超過(guò)今天福也,否則UIDatePicker的邊框變色

分析:

  • 1.出生日期是一個(gè)日期,那么觀察的對(duì)象就是一個(gè)日期date
  • 2.不能超過(guò)今天攀圈,那么需要一個(gè)涮選條件判斷是否選擇的日期超過(guò)今天
  • 3.如果超過(guò)今天那么UIDatePicker邊框變顏色暴凑,這里需要一個(gè)映射,超過(guò)是一種顏色赘来,沒(méi)超過(guò)是一種顏色

代碼如下:

        //出生日期不能超過(guò)今天搬设,否則邊框變色
        let birthdayOb = birthdayPicker.rx.date
            .map{NSObject.isValidDate(date: $0)} //判斷日期是否超過(guò)今天
        birthdayOb.map{$0 ? UIColor.red: UIColor.clear} //超過(guò)今天返回紅色,沒(méi)超過(guò)則無(wú)色
            .subscribe { color in
                self.birthdayPicker.layer.borderColor = color.cgColor
            }
            .disposed(by: disposeBag)

//日期是否小于當(dāng)天
    class func isValidDate(date: Date) -> Bool {
        let calendar = NSCalendar.current
        let compare = calendar.compare(date, to: Date.init(), toGranularity: .day)
        return compare == .orderedDescending
    }

這里的map函數(shù)是一個(gè)高階函數(shù)撕捍,再后面的文章中拿穴,會(huì)再去探索高階函數(shù)的,這里它就是把一個(gè)序列映射成另一個(gè)序列

需求二

  • 性別選擇

分析:

  • 1.性別選擇忧风,兩個(gè)按鈕的單項(xiàng)選擇默色,那么邏輯處理在一起沒(méi)必要單獨(dú)處理
  • 2.我們觀察的是性別,那么需要?jiǎng)?chuàng)建一個(gè)性別的序列
  • 3.male處于選中狀態(tài)狮腿,那么female則是非選中狀態(tài)
  • 4.按鈕是通過(guò)點(diǎn)擊來(lái)改變狀態(tài)的

代碼如下:

        //性別選擇
        let genderSeleteOb = BehaviorRelay<MGGender>(value: .notSelected)
        
        maleBtn.rx.tap
            .map{MGGender.male} //男 序列
            .bind(to: genderSeleteOb) //綁定自定義序列
            .disposed(by: disposeBag)
        
        femaleBtn.rx.tap
            .map {MGGender.female} //女 序列
            .bind(to: genderSeleteOb) //綁定自定義序列
            .disposed(by: disposeBag)
        
        genderSeleteOb.subscribe { gender in
            if gender == .notSelected {return}
            let isMale = gender == .male
            self.maleBtn.setImage(UIImage(named: isMale ? "check": "uncheck"), for: .normal)
            self.femaleBtn.setImage(UIImage(named: isMale ? "uncheck": "check"), for: .normal)
        }
        .disposed(by: disposeBag)

BehaviorRelay帶默認(rèn)值的序列腿宰,也是一個(gè)高階函數(shù),在后面的文章中會(huì)有介紹

需求三

  • 更新按鈕的是否可點(diǎn)擊缘厢,當(dāng)上面的日期選擇不違規(guī)且性別已經(jīng)選擇的情況下吃度,更新按鈕為可點(diǎn)擊狀態(tài),否則不可點(diǎn)擊

分析

1.性別序列已經(jīng)生日序列需要綁定在一起

代碼如下

        let genderSelOB = genderSeleteOb.map {$0 != .notSelected}

        Observable.combineLatest(birthdayOb, genderSelOB) { !$0 && $1 }
            .bind(to: updateBtn.rx.isEnabled)
            .disposed(by: disposeBag)

combineLatest高階函數(shù)

需求四

  • 1.UISwitch控件打開(kāi)時(shí)贴硫,UISlider設(shè)置在1/4處椿每,否在位0
  • 2.當(dāng)Swift掌握程度不為0時(shí)伊者,Swiftswitch按鈕打開(kāi),否則關(guān)閉
        /**
         對(duì)UISwitch來(lái)說(shuō):
         當(dāng)UISwitch為OFF時(shí)间护,表示用戶不了解Swift亦渗,因此,下面的UISlider應(yīng)該為0汁尺;
         當(dāng)UISwitch為ON時(shí)法精,可以默認(rèn)把UISlider設(shè)置在1/4的位置,表示大致了解痴突;
         
         對(duì)于UISlider來(lái)說(shuō):
         當(dāng)UISlider不為0時(shí)搂蜓,應(yīng)該自動(dòng)把UISwitch設(shè)置為ON;
         當(dāng)UISlider為0時(shí)辽装,應(yīng)該自動(dòng)把UISwitch設(shè)置為OFF帮碰;
         */
        
        knowSwiftSwitch.rx.value.map {$0 ? 0.25 : 0}
            .bind(to: swiftLevelSlider.rx.value)
            .disposed(by: disposeBag)
        
        swiftLevelSlider.rx.value.map {$0 > 0 ? true : false}
            .bind(to: knowSwiftSwitch.rx.value)
            .disposed(by: disposeBag)

需求五

  • 熱衷程度控制下面愛(ài)心的大小
        //愛(ài)心大小
        passionToLearnStepper.rx.value.skip(1)
            .subscribe { value in
                UIView .animate(withDuration: 1) {
                    self.heartHeightConstraint.constant = value * 10
                    self.view.layoutIfNeeded()
                }
            }
            .disposed(by: disposeBag)

說(shuō)時(shí)遲那時(shí)快,今天的RxSwift簡(jiǎn)單實(shí)戰(zhàn)就介紹到這里啦如迟。小伙伴們可以在項(xiàng)目中趕快用起來(lái)吧。別忘了手里的小星星哦~~~~

demo下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攻走,一起剝皮案震驚了整個(gè)濱河市殷勘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昔搂,老刑警劉巖玲销,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異摘符,居然都是意外死亡贤斜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門逛裤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瘩绒,“玉大人,你說(shuō)我怎么就攤上這事带族∷螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蝙砌,是天一觀的道長(zhǎng)阳堕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)择克,這世上最難降的妖魔是什么恬总? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮肚邢,結(jié)果婚禮上壹堰,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好缀旁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布记劈。 她就那樣靜靜地躺著,像睡著了一般并巍。 火紅的嫁衣襯著肌膚如雪目木。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天懊渡,我揣著相機(jī)與錄音刽射,去河邊找鬼。 笑死剃执,一個(gè)胖子當(dāng)著我的面吹牛誓禁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肾档,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼摹恰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了怒见?” 一聲冷哼從身側(cè)響起俗慈,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遣耍,沒(méi)想到半個(gè)月后闺阱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舵变,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年酣溃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纪隙。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赊豌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绵咱,到底是詐尸還是另有隱情亿絮,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布麸拄,位于F島的核電站派昧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拢切。R本人自食惡果不足惜蒂萎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淮椰。 院中可真熱鬧五慈,春花似錦纳寂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至争拐,卻和暖如春腋粥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背架曹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工隘冲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绑雄。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓展辞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親万牺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罗珍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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