popToViewController和popToRootViewController方法調(diào)用后,在ViewWillDisappear中self.navigationController為nil的問題

目錄

  • 1.背景
  • 2.原因
  • 3.如何解決
  • 4.總結(jié)

1.背景

在我們的APP中,從首頁付費(fèi)故事-VIP故事-點(diǎn)擊購買-購買結(jié)果界面-立刻收聽-故事詳情頁-點(diǎn)擊播放-播放界面-返回到VIP故事界面,導(dǎo)航欄消失

2.原因

  1. 最開始懷疑是設(shè)置setNavigationBarHidden沒有設(shè)置或者設(shè)置的BOOL值相反。根據(jù)這個推測,在以上流程中相關(guān)的ViewController中搜索NavigationBarHidden,查看之后發(fā)現(xiàn)都是配對出現(xiàn)的,沒有問題。但是從KSGoodDetailViewControllerpop到KSVipListViewController時,NavigationBarHidden的值變?yōu)榱?。
  2. 排除了沒有設(shè)置或者賦值錯誤的問題,那就繼續(xù)查看點(diǎn)擊返回按鈕時操作,發(fā)現(xiàn)這一塊的返回不一樣,如果是已購買,則pop時需要跳過購買結(jié)果界面,否則直接popViewController,代碼如下
- (void)leftViewTapped:(KSPersonalTopBar *)topBar {
    
    NSArray *viewControllers = self.navigationController.viewControllers;
    NSInteger indexCount = viewControllers.count;
    if (indexCount > 2 && [viewControllers[indexCount - 2] isKindOfClass:NSClassFromString(@"KSOrderResultViewController")]) {
        UIViewController *vv = [viewControllers safeObjectAtIndex:indexCount - 3];
        if (vv) {
            [self.navigationController popToViewController:vv animated:YES];
        }
    } else {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

popToViewController改為popToViewController則沒有此問題,那么用popToRootViewController呢,則存在一樣的問題,在ViewWillDisappear方法中self.navigationControllernil,導(dǎo)致在[self.navigationController setNavigationBarHidden:NO animated:YES]方法不執(zhí)行。所以回到VIP故事界面時,導(dǎo)航欄不顯示。

  1. 在Google上搜了一下,也有網(wǎng)友遇到此問題,其中在Apple工作的possen

    Not sure if this fixes your problem but I had this problem because the class that implemented the code that popped the view controller was actually getting popped. This caused my self.navigationController to be nil because it itself was getting removed.

3.如何解決

當(dāng)時最初的想法,是放到viewDidLoad里面,移除self.navigationcontroller.viewcontrollers中對應(yīng)的ViewController,但是在Stack Overflow上面看到在此處操作,容易出現(xiàn)ViewController不在棧中的情況,最后還是保留在點(diǎn)擊的時候,移除對應(yīng)的ViewController,然后將popToViewController方法改為popViewControllerAnimated,如下

- (void)leftViewTapped:(KSPersonalTopBar *)topBar {
    NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy];
    NSInteger indexCount = viewControllers.count;
    if (indexCount > 2 && [viewControllers[indexCount - 2] isKindOfClass:NSClassFromString(@"KSOrderResultViewController")]) {
        [viewControllers removeObjectAtIndex:indexCount - 2];
        self.navigationController.viewControllers = [viewControllers copy];
    }
    [self.navigationController popViewControllerAnimated:YES];
}

4.總結(jié)

此類問題在我看來,是蘋果的bug,這種bug給開發(fā)者帶來極大的開發(fā)負(fù)擔(dān),也降低了用戶的良好體驗(yàn),為了避免此問題的發(fā)生,我在我們的工程中搜索了所有調(diào)用popToViewControllerpopToRootViewController方法的地方是否在ViewWillDisappear調(diào)用了self.navigationController,確保萬無一失。

參考的鏈接

popToRootViewControllerAnimated popToViewController navigationController nil
NavigationController becomes nil after popToViewController

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

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

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