目錄
- 1.背景
- 2.原因
- 3.如何解決
- 4.總結(jié)
1.背景
在我們的APP中您朽,從首頁(yè)付費(fèi)故事-VIP故事-點(diǎn)擊購(gòu)買(mǎi)-購(gòu)買(mǎi)結(jié)果界面-立刻收聽(tīng)-故事詳情頁(yè)-點(diǎn)擊播放-播放界面-返回到VIP故事界面,導(dǎo)航欄消失
2.原因
- 最開(kāi)始懷疑是設(shè)置
setNavigationBarHidden
沒(méi)有設(shè)置或者設(shè)置的BOOL
值相反。根據(jù)這個(gè)推測(cè),在以上流程中相關(guān)的ViewController中搜索NavigationBarHidden
,查看之后發(fā)現(xiàn)都是配對(duì)出現(xiàn)的,沒(méi)有問(wèn)題夹纫。但是從KSGoodDetailViewController
pop到KSVipListViewController
時(shí),NavigationBarHidden
的值變?yōu)榱?设凹。 - 排除了沒(méi)有設(shè)置或者賦值錯(cuò)誤的問(wèn)題舰讹,那就繼續(xù)查看點(diǎn)擊返回按鈕時(shí)操作,發(fā)現(xiàn)這一塊的返回不一樣闪朱,如果是已購(gòu)買(mǎi)月匣,則pop時(shí)需要跳過(guò)購(gòu)買(mǎi)結(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
則沒(méi)有此問(wèn)題桶错,那么用popToRootViewController
呢,則存在一樣的問(wèn)題胀蛮,在ViewWillDisappear
方法中self.navigationController
為nil
院刁,導(dǎo)致在[self.navigationController setNavigationBarHidden:NO animated:YES]
方法不執(zhí)行。所以回到VIP故事界面時(shí)粪狼,導(dǎo)航欄不顯示退腥。
-
在Google上搜了一下,也有網(wǎng)友遇到此問(wèn)題再榄,其中在
Apple
工作的possen
說(shuō)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)時(shí)最初的想法狡刘,是放到viewDidLoad里面,移除self.navigationcontroller.viewcontrollers
中對(duì)應(yīng)的ViewController
,但是在Stack Overflow上面看到在此處操作困鸥,容易出現(xiàn)ViewController
不在棧中的情況嗅蔬,最后還是保留在點(diǎn)擊的時(shí)候,移除對(duì)應(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é)
此類(lèi)問(wèn)題在我看來(lái)澜术,是蘋(píng)果的bug,這種bug給開(kāi)發(fā)者帶來(lái)極大的開(kāi)發(fā)負(fù)擔(dān)猬腰,也降低了用戶的良好體驗(yàn)鸟废,為了避免此問(wèn)題的發(fā)生,我在我們的工程中搜索了所有調(diào)用popToViewController
和popToRootViewController
方法的地方是否在ViewWillDisappear
調(diào)用了self.navigationController
,確保萬(wàn)無(wú)一失姑荷。
參考的鏈接
popToRootViewControllerAnimated popToViewController navigationController nil
NavigationController becomes nil after popToViewController