iOS App 假死,你真的徹底解決這個問題了嗎

現(xiàn)象

最近在我們的 App 中遇到了一個奇葩的問題史翘,在某種場景下枉长,App 會處于假死的狀態(tài)。

現(xiàn)象:點擊屏幕上的任何位置都沒有反應(yīng)琼讽,按 Home 鍵后再打開 App 才能正常

在一個不經(jīng)意的操作中必峰,終于發(fā)現(xiàn)了復(fù)現(xiàn)規(guī)律,當(dāng)進(jìn)入到某個特定的頁面后钻蹬,再 pop 回到 UINavigationController 的第一級時吼蚁,此時如果在屏幕邊緣右滑,問題就出現(xiàn)了问欠。

在我們的 App 中肝匆,這個特定的頁面是一個包含有 WKWebView 的 ViewController,當(dāng)時我們模仿了微信在左上角自定義了返回按鈕和關(guān)閉按鈕顺献。由于自定義了 leftBarButtons旗国,所以屏幕邊緣右滑返回的功能就失效了。我當(dāng)時理所當(dāng)然地在這個頁面中添加了以下代碼

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer is UIScreenEdgePanGestureRecognizer, !self.webView.canGoBack {
        return true
    }
    return false
}

當(dāng)我以為優(yōu)雅地解決了右滑返回的問題時注整,卻發(fā)現(xiàn)引入了這么嚴(yán)重的一個問題能曾。。设捐。

解決方案借浊?

于是我 Google 了一下,發(fā)現(xiàn)不少人都給出同一個建議萝招,看下面代碼

func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
    let isRoot = viewController == navigationController.viewControllers.first
    navigationController.interactivePopGestureRecognizer?.isEnabled = !isRoot
}

問題是能解決,但是徹底解決問題了嗎存捺?

這個方案是去接管 UINavigationControllerdelegate槐沼,當(dāng)在 UINavigationController 的第一級時關(guān)閉屏幕邊緣右滑功能,反之則開啟捌治。

但大家是否有想過這樣的問題:

  1. 一般的 iOS App 都有幾個 Tab(我們的 App 就有三個 Tab)岗钩,這就意味著每一個 Tab 的 UINavigationController 都要去做這個處理,萬一哪天增加了一個 Tab 但沒有做這個處理肖油,那問題同樣會遇上兼吓。
  2. App 中也經(jīng)常會做 present 操作,而 present 出來的 ViewController 一般也會在 UINavigationController 里面森枪,同樣要處理视搏,否則還會遇上這個問題审孽。

這樣才是正解

想到上面兩個場景,不寒而栗浑娜,另謀其它解決方案佑力!

回想一下問題出現(xiàn)的過程,如果不進(jìn)入到那個特定的 ViewController筋遭,在屏幕邊緣右滑是沒有問題的打颤,而進(jìn)入到特定頁面再出來問題就出現(xiàn)了,為什么這么奇怪漓滔?

由于改的代碼量很少编饺,很容易就關(guān)注到下面這個地方

navigationController?.interactivePopGestureRecognizer?.delegate

我修改過 delegate 對象,導(dǎo)致問題出現(xiàn)响驴,那原來的 delegate 對象必然不是空的反肋,并且原來的 delegate 對象保證了即使在 UINavigationController 的第一級右滑也不會有假死的問題,所以完美的解決方案其實很簡單踏施,先持有原 delegate 對象石蔗,最后再修改回去

weak var originalGestureDelegate: UIGestureRecognizerDelegate?
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.originalGestureDelegate = self.navigationController?.interactivePopGestureRecognizer?.delegate
    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.interactivePopGestureRecognizer?.delegate = self.originalGestureDelegate
}

好奇

很好奇,原來的 delegate 對象到底是什么畅形?

打個斷點即可看到是 UINavigationInteractiveTransitionBase 的對象养距,這里來找到了個很好玩的東西,可以看看這篇文章

iOS | 全屏右滑返回詳解

要養(yǎng)成一個好習(xí)慣

要養(yǎng)成一個好習(xí)慣日熬,修改一個級的屬性時棍厌,一定要先持有這個屬性后,再賦值竖席,最終要修改回來

這樣說可能有點繞耘纱,大家平時在做一些界面的時候,某些界面要隱藏掉導(dǎo)航欄毕荐,此時可不能粗暴地在這個頁面中將導(dǎo)航欄隱藏掉束析,正確的做法應(yīng)該跟上面的解決方案一樣,在 viewWillAppear 先持有上一個界面的導(dǎo)航欄狀態(tài)憎亚,在 viewWillDisappear 修改回原來的狀態(tài)

好慷在家

廣告時間

歡迎大家來下載我們的 App 好慷在家员寇,提供專業(yè)的保潔保姆服務(wù),38節(jié)活動進(jìn)行中第美,買份家務(wù)包年蝶锋,寵愛自己一整年!

好慷38節(jié)活動

都看完了什往,不點個贊就走扳缕,這樣是耍流氓知道嗎?????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市躯舔,隨后出現(xiàn)的幾起案子驴剔,更是在濱河造成了極大的恐慌,老刑警劉巖庸毫,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔拟,死亡現(xiàn)場離奇詭異,居然都是意外死亡飒赃,警方通過查閱死者的電腦和手機(jī)利花,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來载佳,“玉大人炒事,你說我怎么就攤上這事∧杌郏” “怎么了挠乳?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姑躲。 經(jīng)常有香客問我睡扬,道長,這世上最難降的妖魔是什么黍析? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任卖怜,我火速辦了婚禮,結(jié)果婚禮上阐枣,老公的妹妹穿的比我還像新娘马靠。我一直安慰自己,他們只是感情好蔼两,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布甩鳄。 她就那樣靜靜地躺著,像睡著了一般额划。 火紅的嫁衣襯著肌膚如雪妙啃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天锁孟,我揣著相機(jī)與錄音彬祖,去河邊找鬼。 笑死品抽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甜熔。 我是一名探鬼主播圆恤,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盆昙?” 一聲冷哼從身側(cè)響起羽历,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淡喜,沒想到半個月后秕磷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炼团,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年澎嚣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟芝。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡易桃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锌俱,到底是詐尸還是另有隱情晤郑,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布贸宏,位于F島的核電站造寝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吭练。R本人自食惡果不足惜诫龙,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望线脚。 院中可真熱鬧赐稽,春花似錦、人聲如沸浑侥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寓落。三九已至括丁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伶选,已是汗流浹背史飞。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留仰税,地道東北人构资。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像陨簇,于是被迫代替她去往敵國和親吐绵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫权纤、插件遣疯、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評論 4 61
  • 今天上午吆你,讀到了笑來老師在《通往財富自由之路》的一篇名為《什么是朋友》的文章歇竟,滿滿的感動丧枪,也深深的折服踢故。這也讓我重...
    沫葵閱讀 395評論 0 0
  • 晚上想得再多再好运挫,不能即刻去做旗们,明天一早醒來廷痘,還是重復(fù)昨天蔓涧。 有時候,很多人不是想得太多做得太少牍疏,而是晚上想得太多...
    小觀念閱讀 281評論 0 0
  • 矛盾中或許有許多個相互不獨(dú)立的系統(tǒng)蠢笋,在這許多系統(tǒng)中,我們要找到他們系統(tǒng)最大合力鳞陨,也就是最佳的解決方案昨寞。 要弄清楚合...
    科幻經(jīng)典閱讀 292評論 0 0