這個問題困擾了我大半年的時間了祠斧,以前用了pop手勢,但是自己在使用項目的時候一般都是點擊返回按鈕,很少用到手勢去操作猫十,所以很少發(fā)現(xiàn)這個問題,甚至有段時間以為這是iOS系統(tǒng)自身的bug,但是有時候想一想又覺得不可能啊拖云,人家都什么水平啊贷笛,我都能出現(xiàn)的問題人家研發(fā)開發(fā)語言的人怎么可能不知道。
但是自己平時又很少遇到這個問題 宙项,往往這種有時候出現(xiàn)有時候不出現(xiàn)的bug真的很難解決乏苦,因為復現(xiàn)不了,終于尤筐,今天在玩自己開發(fā)的項目的時候偶然將這個bug給復現(xiàn)了汇荐,并且能夠百分百復現(xiàn)。
然后自己思考了一下盆繁,我們需要在項目中實現(xiàn)pop手勢的時候需要在根控制器的navigation中實現(xiàn)這樣一句代碼:
self.interactivePopGestureRecognizer!.delegate=nil
然后當我們的應用進行了push以后掀淘,就可以使用手勢向右滑動進行pop了。
至于為什么會出現(xiàn)卡死的現(xiàn)象呢油昂,因為我們使用手勢pop的前提是我們先進行了push啊革娄,但是如果是直接在根視圖控制器下向右滑動呢,結果就把根控制器給pop了秕狰,沒錯稠腊,是給pop了,而且這個時候你去打印navigation控制器的話鸣哀,你會發(fā)現(xiàn)架忌,navigationcontroller居然變成nil了,就像杯子沒了底我衬,這個時候還怎么裝水啊叹放,但是我們看到的頁面還在,這個時候我們再去點擊頁面上的有push功能的地方挠羔,我們會發(fā)現(xiàn)井仰,成功的push了,但是頁面還是沒有變啊破加,相當于已經(jīng)進入到下一個頁面了俱恶,但是視圖層卻不是那一個,然后我們隨便點擊頁面上的任何地方都不會有反映范舀,如果不知道怎么回事的人就會認為是應用卡死了合是,這是個很嚴重的問題。
當然锭环,也不是一定要重啟應用才能恢復這個問題聪全,這個時候我們再向右滑動一下pop出沒有成功push的頁面控制器就好了。
至于這個問題我們應該怎樣解決呢辅辩,我們只需要在根控制器中加上一個判斷就行了难礼,如果當前的頁面是根控制的時候我們就將pop手勢給關閉:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled=false
反之就給打開:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled=true
這樣娃圆,我們在頁面回到跟控制器的時候就不能再進行手勢pop了,就不會出現(xiàn)這樣的問題了蛾茉。
當然讼呢,我們也不可能每個根控制都這樣去寫,我們只需要寫一個公共的父類臀稚,然后在父類中去實現(xiàn)navigation的代理方法吝岭,在navigation的didshow代理方法中判斷一下當前navigation的frist控制器是不是當前所在的頁面的控制器,是:就關閉手勢吧寺,不是:就打開手勢就行了窜管,就可以完美解決這個問題。修改之后經(jīng)過了多次測試稚机,終于再也不用擔心應用會卡死但是又不知道為什么的情況了幕帆。
經(jīng)過了這個事情,也應該反省一下自己赖条,我們開發(fā)的過程中如果出現(xiàn)了什么比較難發(fā)現(xiàn)的bug失乾,一定不要就覺得是系統(tǒng)或者語言有什么問題,應該多找找自己的原因纬乍,什么地方?jīng)]有做到位碱茁,一定要反復使用自己開發(fā)的項目,你就會發(fā)現(xiàn)很多平時不容易出現(xiàn)的bug仿贬,慢慢的纽竣,才能讓自己項目變得完美,給用戶一個良好的體驗茧泪。