這個問題困擾了我大半年的時間了,以前用了pop手勢,但是自己在使用項目的時候一般都是點擊返回按鈕,很少用到手勢去操作,所以很少發現這個問題,甚至有段時間以為這是iOS系統自身的bug,但是有時候想一想又覺得不可能啊,人家都什么水平啊,我都能出現的問題人家研發開發語言的人怎么可能不知道。
但是自己平時又很少遇到這個問題 ,往往這種有時候出現有時候不出現的bug真的很難解決,因為復現不了,終于,今天在玩自己開發的項目的時候偶然將這個bug給復現了,并且能夠百分百復現。
然后自己思考了一下,我們需要在項目中實現pop手勢的時候需要在根控制器的navigation中實現這樣一句代碼:
self.interactivePopGestureRecognizer!.delegate=nil
然后當我們的應用進行了push以后,就可以使用手勢向右滑動進行pop了。
至于為什么會出現卡死的現象呢,因為我們使用手勢pop的前提是我們先進行了push啊,但是如果是直接在根視圖控制器下向右滑動呢,結果就把根控制器給pop了,沒錯,是給pop了,而且這個時候你去打印navigation控制器的話,你會發現,navigationcontroller居然變成nil了,就像杯子沒了底,這個時候還怎么裝水啊,但是我們看到的頁面還在,這個時候我們再去點擊頁面上的有push功能的地方,我們會發現,成功的push了,但是頁面還是沒有變啊,相當于已經進入到下一個頁面了,但是視圖層卻不是那一個,然后我們隨便點擊頁面上的任何地方都不會有反映,如果不知道怎么回事的人就會認為是應用卡死了,這是個很嚴重的問題。
當然,也不是一定要重啟應用才能恢復這個問題,這個時候我們再向右滑動一下pop出沒有成功push的頁面控制器就好了。
至于這個問題我們應該怎樣解決呢,我們只需要在根控制器中加上一個判斷就行了,如果當前的頁面是根控制的時候我們就將pop手勢給關閉:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled=false
反之就給打開:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled=true
這樣,我們在頁面回到跟控制器的時候就不能再進行手勢pop了,就不會出現這樣的問題了。
當然,我們也不可能每個根控制都這樣去寫,我們只需要寫一個公共的父類,然后在父類中去實現navigation的代理方法,在navigation的didshow代理方法中判斷一下當前navigation的frist控制器是不是當前所在的頁面的控制器,是:就關閉手勢,不是:就打開手勢就行了,就可以完美解決這個問題。修改之后經過了多次測試,終于再也不用擔心應用會卡死但是又不知道為什么的情況了。
經過了這個事情,也應該反省一下自己,我們開發的過程中如果出現了什么比較難發現的bug,一定不要就覺得是系統或者語言有什么問題,應該多找找自己的原因,什么地方沒有做到位,一定要反復使用自己開發的項目,你就會發現很多平時不容易出現的bug,慢慢的,才能讓自己項目變得完美,給用戶一個良好的體驗。