實現(xiàn)一個需求 —— 使用 RxSwift 訂閱 UIView 的 isHidden 屬性

最近在做項目的時候俏橘,遇到了一個需求允华。我有三個 View(View1, View2, View3)靴寂,View1 和 View2 其中一個顯示汉额,View3 就顯示。

稍微思考了一下榨汤,覺得訂閱 isHidden 屬性的改變,然后通過 CombineLatest 組合 Observable 來實現(xiàn)怎茫。

問題

而問題就來了收壕。。轨蛤。

14907957629836.jpg

isHidden 居然是個 UIBindingObserver<UIView, Bool>

嘗試使用 KVO

我在使用 OC 時蜜宪,會使用 ReactiveCocoa 。而在 ReactiveCocoa 我經(jīng)常使用 KVO 去監(jiān)控屬性祥山∑匝椋或者在 RxSwift 也有類似的方法吧?

14907963190486.jpg

好像的確有類似的東西缝呕,那就到源碼中查看怎么使用吧澳窑。。供常。

14907966551999.jpg

從這些注釋摊聋,大概知道了使用方法,那就開干吧栈暇。麻裁。。

14907975018713.jpg

只打印了 next(Optional(false)), 并不能監(jiān)控到 isHidden 值的變化=源祈。=

為什么呢煎源?難道我使用方法不對?找找可參照的例子香缺。
KVOObservableTests.swift 找到了一段測試代碼:

14907981189220.jpg

注意手销,這里的屬性都使用了 dynamic , 感覺好像抓到了些什么?先嘗試定義一個類試試看图张。

14907963190486.jpg

起作用了??原献,那把 dynamic 刪了呢?

14907984225211.jpg

又不好使了?? 為什么呢埂淮?
其實喵神在《Swift 開發(fā)必備 Tips》中就提過這個問題姑隅。

14907990537387.jpg

所以,只能另想辦法了??

使用 methodInvoked

還記得 UITextField 經(jīng)常使用的 text 屬性么倔撞?它又是怎么實現(xiàn)的呢讲仰?

14907995154959.jpg

查看源碼,發(fā)現(xiàn)它使用了 UIControlvalue 方法痪蝇。繼續(xù)往下看鄙陡。冕房。。

14907997006995.jpg

這里是通過監(jiān)控控件事件來實現(xiàn)的趁矾。耙册。??那么 textField.rx.text.subscribe 同樣存在一個問題

textField.text = "test"

這樣的操作,也是沒法得到事件的毫捣。详拙。

但可以從這個段代碼中得到給啟發(fā),我是否可以通過訂閱方法處理來完成我想要的需求呢蔓同?我們在設置屬性時必然會走 set 方法饶辙。

14908003089486.jpg

嗯,這個好像是我們需要的方法斑粱,那就看看能否實現(xiàn)吧弃揽。

14908006443769.jpg

好像起作用了,但我們可以做進一步的優(yōu)化则北。我希望事件就給我返回個 Bool,而且包含一開始的默認屬性矿微。

14908009585593.jpg

這樣就得到我想要的結果了??,但我可以讓它變得更好用點尚揣,把它封裝到 rx 中作為一個 hidden 屬性好了

extension Reactive where Base: UIView {
    
    var hidden: Observable<Bool> {
        return self.methodInvoked(#selector(setter: self.base.isHidden))
            .map { event -> Bool in
                guard let isHidden = event.first as? Bool else {
                    fatalError()
                }
                
                return isHidden
            }
            .startWith(self.base.isHidden)
    }
    
    
}
14908014060346.jpg

嗯冷冗,現(xiàn)在就可以愉快的訂閱 hidden 屬性了 (^-^)V

如果大家有更好的方法,歡迎分享討論惑艇。

最后:歡迎討論蒿辙、批評、指錯滨巴。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末思灌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恭取,更是在濱河造成了極大的恐慌泰偿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈垮,死亡現(xiàn)場離奇詭異耗跛,居然都是意外死亡,警方通過查閱死者的電腦和手機攒发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門调塌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惠猿,你說我怎么就攤上這事羔砾。” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵姜凄,是天一觀的道長政溃。 經(jīng)常有香客問我,道長态秧,這世上最難降的妖魔是什么董虱? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮申鱼,結果婚禮上愤诱,老公的妹妹穿的比我還像新娘。我一直安慰自己润讥,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布盘寡。 她就那樣靜靜地躺著楚殿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竿痰。 梳的紋絲不亂的頭發(fā)上脆粥,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音影涉,去河邊找鬼变隔。 笑死,一個胖子當著我的面吹牛蟹倾,可吹牛的內容都是我干的匣缘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲜棠,長吁一口氣:“原來是場噩夢啊……” “哼肌厨!你這毒婦竟也來了?” 一聲冷哼從身側響起豁陆,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柑爸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盒音,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體表鳍,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年祥诽,在試婚紗的時候發(fā)現(xiàn)自己被綠了懂鸵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片安券。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出蘸吓,到底是詐尸還是另有隱情代兵,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站颇玷,受9級特大地震影響,放射性物質發(fā)生泄漏就缆。R本人自食惡果不足惜帖渠,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竭宰。 院中可真熱鬧空郊,春花似錦、人聲如沸切揭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓旬。三九已至哼审,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孕豹,已是汗流浹背涩盾。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留励背,地道東北人春霍。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像叶眉,于是被迫代替她去往敵國和親址儒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容