盡量不要在viewWillDisappear:方法中移除通知

在了解控制器的生命周期之后,我們都知道viewWillAppear:方法是在控制器的view將要顯示的時(shí)候調(diào)用的,而viewWillDisappear:方法是在控制器的view將要隱藏的時(shí)候調(diào)用。很多時(shí)候我們根據(jù)自身需要將相關(guān)代碼邏輯添加到這兩個(gè)方法中,我們看下如下代碼片段:

監(jiān)聽鍵盤的通知代碼

這段代碼是在控制器的viewDidLoad:方法中注冊了一個(gè)鍵盤彈出的通知和鍵盤隱藏的通知,然后在調(diào)用到相關(guān)方法時(shí)分別在控制臺(tái)打印,在viewWillDisappear:界面即將隱藏的時(shí)候移除通知,具體效果如下圖:

代碼運(yùn)行效果圖

這看上去沒什么問題,鍵盤的顯示和隱藏也都能監(jiān)聽到。尼瑪!被騙了?。?/p>

其實(shí)并不然,細(xì)心的開發(fā)人員會(huì)知道,蘋果在iOS7中增加了導(dǎo)航控制器側(cè)滑返回功能,現(xiàn)在絕大多數(shù)App都使用了這項(xiàng)功能(有些App重寫了自帶的返回鍵之后忘記開啟左滑返回手勢了)。那么這項(xiàng)功能會(huì)帶來什么問題呢?我們接著看下面的操作:

側(cè)滑效果圖

隨著iPhone手機(jī)屏幕越來越大,左上角的返回按鈕早已夠不到(原諒我手小= =!),很多“手賤”的人喜歡通過這種側(cè)滑的形式返回上一個(gè)界面(其實(shí)說的是我。。。),而這種側(cè)滑返回會(huì)出現(xiàn)什么問題呢?當(dāng)觸發(fā)側(cè)滑返回時(shí)會(huì)調(diào)用系統(tǒng)自帶的viewWillDisappear:方法,在該方法中將監(jiān)聽鍵盤顯示和隱藏的通知移除后,要是這時(shí)候用戶取消了側(cè)滑返回(即回到了原始狀態(tài)),那么再點(diǎn)擊界面上的textField喚出鍵盤,是不會(huì)發(fā)送鍵盤顯示和隱藏的通知了,因?yàn)橥ㄖ驯灰瞥?。?!?/p>

那么遇到這種情況有什么方法解決么?

我這里提供兩種解決方案:

1、將注冊監(jiān)聽鍵盤顯示和隱藏的代碼放到viewWillAppear:方法中

因?yàn)樵谟|發(fā)側(cè)滑返回后又取消側(cè)滑,則會(huì)調(diào)用viewWillAppear:方法。那么如果側(cè)滑返回將通知移除,則在取消側(cè)滑時(shí)又會(huì)將通知重新添加進(jìn)去。

2、將移除通知的代碼放到dealloc方法中

dealloc方法是在控制器銷毀之時(shí)調(diào)用的。這個(gè)時(shí)候移除通知而不是在viewWillDisappear:方法中移除可以有效避免上述的問題。既然控制器都銷毀了,那么還留著相關(guān)的通知干嘛?該移除的移除。


上面給出了兩種解決方案,要說哪種最優(yōu),還得視情況而定。

我在這里可以舉個(gè)??。假如我們現(xiàn)在有這么個(gè)場景:在控制器的view上有個(gè)label,在label上添加一個(gè)手勢(一般手勢都是在創(chuàng)建完label之后添加的),假設(shè)我在viewWillDisappear:方法中移除該手勢,則此時(shí)用戶側(cè)滑返回之時(shí)又取消側(cè)滑返回,那么原先在label上的手勢卻再也添加不回來了(這里label一般在viewDidLoad方法中創(chuàng)建),因?yàn)関iewDidLoad方法不會(huì)再次調(diào)用。而第二種方法卻可以有效避免這種情況,這樣就可以避免我這種“手賤”的任意搗鼓了。

而第一種方案比較適合在這種情境下使用:當(dāng)A控制器的view中有個(gè)文本輸入框,需要監(jiān)聽鍵盤的顯示和隱藏事件,當(dāng)該頁面push到B控制器時(shí),若B控制器恰巧也需要監(jiān)聽鍵盤顯示和隱藏事件,這時(shí)候若不將A控制器的監(jiān)聽事件給移除的話,那么B控制器中鍵盤顯示或隱藏時(shí),A控制器中也會(huì)接收到通知并作出相應(yīng)的事件處理,而這有可能是我們不期望出現(xiàn)的,所以該情況下在viewWillAppear:方法中添加通知,在viewWillDisappear:方法中移除通知比較合適。


最后,我們再來總結(jié)下重點(diǎn):

1、iOS7新增加了導(dǎo)航控制器側(cè)滑手勢,當(dāng)觸發(fā)側(cè)滑返回時(shí),會(huì)調(diào)用系統(tǒng)的viewWillDisappear:方法,取消側(cè)滑返回時(shí)又會(huì)調(diào)用viewWillAppear:方法。

2、在做手勢和通知等一系列操作之時(shí)要分情況考慮:若通知和手勢是與UI相關(guān)的,如監(jiān)聽UITextField鍵盤的顯示和隱藏通知等應(yīng)該在viewWillAppear:方法中添加通知,在viewWillDisappear:方法中移除通知;而與UI無關(guān)的通知和手勢,像自定義通知等,應(yīng)該在viewDidLoad等一次性方法中添加,在dealloc方法中釋放。在此感謝@xiubin 和?@KtZhang給以的指正。

3、在viewWillAppear:、viewWillDisappear:、viewDidAppear:、viewDidDisappear:等類似于這種會(huì)多次調(diào)用的系統(tǒng)方法中添加代碼時(shí),一定要多考慮業(yè)務(wù)邏輯,以免出現(xiàn)不必要的麻煩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,022評論 4 61
  • 1.xcode5和xcode7區(qū)別 1.xcode7沒有Frameworks文件夾,xcode7內(nèi)部會(huì)自動(dòng)幫你導(dǎo)入...
    彼岸的黑色曼陀羅閱讀 570評論 0 2
  • 毛里求斯是天堂的原鄉(xiāng),因?yàn)樘焯檬欠抡彰锴笏惯@個(gè)小島而打造出來的。而今,這個(gè)天堂的原鄉(xiāng),已經(jīng)成為全世界享受生命、解...
    驢說閱讀 424評論 0 0
  • 忠誠: 忠誠,是人的寶貴品格,是無價(jià)之寶。一個(gè)人是不能夠獨(dú)自生存于這個(gè)世界上的,讀書的時(shí)候,我們生活在一個(gè)班級里,...
    洋氵羊閱讀 248評論 0 1
  • 道路兩旁還殘留著踩踏的痕跡,被壓低的一簇簇雜草看著一道已經(jīng)只剩下黃土的小徑,懸著那垂危的生命沉醉在被陽光照射著的最...
    竹_簡閱讀 312評論 0 0

友情鏈接更多精彩內(nèi)容