目錄
- 1.背景
- 2.原因
- 3.如何解決
- 4.總結(jié)
1.背景
在我們的APP中,從首頁付費(fèi)故事-VIP故事-點(diǎn)擊購買-購買結(jié)果界面-立刻收聽-故事詳情頁-點(diǎn)擊播放-播放界面-返回到VIP故事界面,導(dǎo)航欄消失
2.原因
- 最開始懷疑是設(shè)置
setNavigationBarHidden沒有設(shè)置或者設(shè)置的BOOL值相反。根據(jù)這個推測,在以上流程中相關(guān)的ViewController中搜索NavigationBarHidden,查看之后發(fā)現(xiàn)都是配對出現(xiàn)的,沒有問題。但是從KSGoodDetailViewControllerpop到KSVipListViewController時,NavigationBarHidden的值變?yōu)榱?。 - 排除了沒有設(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.navigationController為nil,導(dǎo)致在[self.navigationController setNavigationBarHidden:NO animated:YES]方法不執(zhí)行。所以回到VIP故事界面時,導(dǎo)航欄不顯示。
-
在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)用popToViewController和popToRootViewController方法的地方是否在ViewWillDisappear調(diào)用了self.navigationController,確保萬無一失。
參考的鏈接
popToRootViewControllerAnimated popToViewController navigationController nil
NavigationController becomes nil after popToViewController