一.UITextField輸入文本監(jiān)聽(tīng)
1.假如你的界面有一個(gè)UITextField文本框,你需要對(duì)其輸入內(nèi)容進(jìn)行監(jiān)聽(tīng)稍计。
accountTextField.reactive.continuousTextValues.observeValues { (text) in
print(text ?? "")
}
2.假如你不想知道UITextField的文本內(nèi)容,而是想知道文本的長(zhǎng)度,那么使用map
函數(shù)進(jìn)行信號(hào)內(nèi)容的修改,然后再對(duì)map
后的信號(hào)進(jìn)行觀察.map
函數(shù)可以對(duì)信號(hào)的內(nèi)容進(jìn)行轉(zhuǎn)換缨恒,他的返回值可以是任何你想要的類型.
accountTextField.reactive.continuousTextValues.map { (text) -> Int in
return text!.characters.count
}.observeValues { (count) in
print(count)
}
3.也許你只是在某個(gè)條件下,才想監(jiān)聽(tīng)UITextfield文本的內(nèi)容。比如:當(dāng)文本的內(nèi)容長(zhǎng)度大于3的時(shí)候骗露,你才想監(jiān)聽(tīng)文本的內(nèi)容岭佳。這時(shí)可以使用filter
函數(shù)進(jìn)行過(guò)濾操作。filter
函數(shù)只能返回Bool類型萧锉。只有當(dāng)filter
函數(shù)返回true的時(shí)候珊随,信號(hào)繼續(xù)傳遞,我們才能監(jiān)聽(tīng)到文本的內(nèi)容柿隙;當(dāng)filter
函數(shù)返回False的時(shí)候玫恳,信號(hào)會(huì)被攔截。
accountTextField.reactive.continuousTextValues.filter { (text) -> Bool in
return text!.characters.count > 3
}.observeValues { (text) in
print(text ?? "")
}
二.UIButton點(diǎn)擊事件監(jiān)聽(tīng).
loginBtn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in
print("btn click")
}
三.Combine Siganl (組合信號(hào)).
最經(jīng)典的案例:登錄界面的實(shí)現(xiàn) 一個(gè)賬號(hào)文本框 一個(gè)密碼文本框 當(dāng)兩個(gè)文本框內(nèi)容的長(zhǎng)度都大于3的時(shí)候 ,login按鈕才可點(diǎn)擊优俘。
//首先創(chuàng)建賬號(hào)文本框的signal 京办,然后使用map函數(shù)對(duì)信號(hào)內(nèi)容進(jìn)行轉(zhuǎn)換。結(jié)果轉(zhuǎn)換為Bool類型
let accountSignal = accountTextField.reactive.continuousTextValues.map { (text) -> Bool in
return text!.characters.count > 3
}
//密碼文本框同理
let pwdSignal = pwdTextField.reactive.continuousTextValues.map { (text) -> Bool in
return text!.characters.count > 3
}
//使用combineLatest函數(shù)將兩個(gè)信號(hào)組合為一個(gè)信號(hào)帆焕,然后利用map函數(shù)對(duì)信號(hào)進(jìn)行轉(zhuǎn)換惭婿。使用<~將信號(hào)的結(jié)果綁定到loginBtn.
loginBtn.reactive.isEnabled <~ accountSignal.combineLatest(with: pwdSignal).map({ $0 && $1
})
如果你對(duì)$不熟悉,可以這樣寫(xiě)
let accountSignal = accountTextField.reactive.continuousTextValues.map { (text) -> Bool in
return text!.characters.count > 3
}
let pwdSignal = pwdTextField.reactive.continuousTextValues.map { (text) -> Bool in
return text!.characters.count > 3
}
loginBtn.reactive.isEnabled <~ accountSignal.combineLatest(with: pwdSignal).map({ (accountValid, pwdValid) -> Bool in
return accountValid && pwdValid
})
四.KVO VS MutableProperty
如果你想對(duì)某個(gè)屬性的value進(jìn)行observe.那么你可以使用KVO 叶雹,當(dāng)然Reactivecocoa里的MutableProperty也可以滿足你的需求,而且它比KVO用起來(lái)更加方便财饥。
//<>里面可以是任意類型,它代表屬性的類型折晦。
let racValue = MutableProperty<Int>(1)
racValue.producer.startWithValues { (make) in
print(make)
}
racValue.value = 10
五.方法調(diào)用攔截
當(dāng)你想獲取到某個(gè)方法被調(diào)用的事件钥星,比如UIViewController的ViewwillAppear事件。
self.reactive.trigger(for: #selector(UIViewController.viewWillAppear(_:))).observeValues { () in
print("viewWillAppear被調(diào)用了")
}
六.監(jiān)聽(tīng)對(duì)象的生命周期
比如你想在某個(gè)對(duì)象被銷毀以后满着,做一些事情谦炒。那么你可以對(duì)這個(gè)對(duì)象的生命周期進(jìn)行監(jiān)聽(tīng),也就是當(dāng)對(duì)象銷毀的時(shí)候风喇,你獲得對(duì)象銷毀的信號(hào),然后觀察這個(gè)信號(hào)宁改。當(dāng)然你也可以重寫(xiě)deinit函數(shù),當(dāng)對(duì)象被銷毀的時(shí)候魂莫,會(huì)調(diào)用deinit函數(shù)还蹲。也就是Objective-C中的dealloc方法。
//按鈕點(diǎn)擊 push到secondVC
loginBtn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in
let secondVC = SecondViewController()
//當(dāng)在secondVC pop的時(shí)候耙考,secondVC會(huì)被銷毀
secondVC.reactive.lifetime.ended.observeCompleted {
print("secondVC 被銷毀")
}
self.navigationController?.pushViewController(secondVC, animated: true)
}
再看下面的例子:
開(kāi)始的時(shí)候給person屬性賦值一個(gè)內(nèi)存地址為0x60800005cfe0對(duì)象谜喊,
然后對(duì)該對(duì)象的生命周期進(jìn)行監(jiān)聽(tīng)。然后給person屬性重新賦值一個(gè)內(nèi)存地址為0x6000002400c0對(duì)象倦始。因?yàn)閜erson指針指向了內(nèi)存為0x6000002400c0的對(duì)象斗遏,所以這個(gè)時(shí)候內(nèi)存為0x60800005cfe0的引用計(jì)數(shù)為0,所以0x60800005cfe0的對(duì)象會(huì)被銷毀,而我們正好對(duì)內(nèi)存為0x60800005cfe0對(duì)象的生命周期進(jìn)行了監(jiān)聽(tīng)楣号,所以會(huì)獲取“person對(duì)象被銷毀了”事件最易。