之前寫過一篇文章解決navigationbar的漸變等自定義相關(guān)問題撤蚊。今天寫這個文章是想寫一下這兩天自己遇到的關(guān)于navigationbar的一些比較難解決的問題塞帐。navigationbar真的是一個寶藏,啥時候都能有新收獲盼理。
原理
每一個被push進(jìn)來的頁面都有自己的navigationcontroller俄删,通過navigationcontroller可以取到。關(guān)于這一點我們可以在代碼里看到畴椰。
如果連續(xù)push3個頁面,那么這三個頁面的navigationcontroller都是同一個抓艳。這一點我們通過打印三個頁面的self.navigationcontroller的地址就可以知道帚戳。
也就是說navigationcontroller像是一個房間儡首,每個viewcontroller像是一個人偏友,一個房間可以住進(jìn)很多個人蔬胯,每個人都可以找到自己的房子约谈,住進(jìn)這個房間以后就可以改變房子的外觀等屬性,就像是我們可以裝修刷漆等等棱诱。
常見問題
了解了這一點以后,很多關(guān)于導(dǎo)航欄的bug的原因自然也就了解炬灭。
- 設(shè)置了隱藏導(dǎo)航欄但是沒有隱藏
首先要看設(shè)置導(dǎo)航欄是否在viewWillAppear靡菇,如果是重归,那么執(zhí)行完這個方法厦凤,而前一個VC還沒有銷毀的時候鼻吮,如果執(zhí)行了viewDidDisappear中的顯示導(dǎo)航欄方法较鼓,就無法隱藏了。如果檢查了發(fā)現(xiàn)沒有問題香椎,就要看是不是設(shè)置了當(dāng)前頁面的navigationcontroller的導(dǎo)航欄隱藏,這個問題比較容易出現(xiàn)層級中有present的頁面或者tabcontroller的情況下禽篱。如果都不是,bug的效果是閃現(xiàn)一下導(dǎo)航欄躺率,最終沒有顯示的情況,就要看前一個頁面是否設(shè)置了顯示悼吱,而且前一個頁面在當(dāng)前頁面被推出之前并沒有執(zhí)行到viewWillAppear方法而是之后才執(zhí)行的。這種情況下可以通過延遲二級頁面的push解決舆绎。 - 通過右滑手勢返回上一頁的時候,滑動產(chǎn)生偏移立即松手猎醇,會出現(xiàn)當(dāng)前導(dǎo)航欄消失的情況窥突。
如果前一頁隱藏了導(dǎo)航欄硫嘶,而當(dāng)前頁設(shè)置了顯示導(dǎo)航欄,就可能會出現(xiàn)這樣的情況沦疾,比較少見,但是確實存在哮塞。當(dāng)時遇到這個bug的時候很懵逼,因為網(wǎng)上能查到的資料也不多忆畅。最終在GitHub上找到了解決方案。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
//MARK:偶爾在非郴捍祝快速的從第二個頁面取消拖返的時候,這里的輸出會是 1 0 1 0送粱。但是第二次的set hidden to no是有效的掂之。
//猜測可能是由于動畫animated的原因抗俄,造成了第一次set hidden to no的還原板惑。具體未知
//所以我們在下一個runloop里去重新設(shè)置下應(yīng)該就OK了
// DLOG(@"1.hidden:%d",self.navigationController.navigationBarHidden);
if (self.navigationController.navigationBarHidden) {
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
// DLOG(@"2.hidden:%d",self.navigationController.navigationBarHidden);
dispatch_async(dispatch_get_main_queue(), ^{
// DLOG(@"3.hidden:%d",self.navigationController.navigationBarHidden);
if (self.navigationController.navigationBarHidden) {
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
// DLOG(@"4.hidden:%d",self.navigationController.navigationBarHidden);
});
}
但是建議大家不要直接使用這個方法偎快,最好是在出錯頁面的viewDidAppear方法中去修改,這樣不會影響到其他頁面裆馒。
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:NO];
if (self.navigationController.navigationBarHidden) {
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
dispatch_async(dispatch_get_main_queue(), ^{
if (self.navigationController.navigationBarHidden) {
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
});
}
遇到的比較難解決的問題暫時就是這兩個丐怯,其他問題諸如手勢返回的時候?qū)Ш綑谙В际且驗闆]有設(shè)置動畫等比較簡單的原因读跷,也比較容易在網(wǎng)上找到答案,在這里就不再贅述了。
大家有遇到其他問題或者對文中有什么覺得不對的地方可以發(fā)在回復(fù)里荡短,我們一起探討啊哆键。