客戶端在開發(fā)過(guò)程中經(jīng)常用到UINavigationController帮毁,在使用UINavigationController過(guò)程中可能會(huì)有一下場(chǎng)景:
viewController1是有navigationBar的绎巨,而viewController2需要隱藏navigationBar笔诵,在viewController2中調(diào)用:
[viewController2.navigationControllersetNavigationBarHidden:YESanimated:YES/NO];
即可隱藏navigationBar蛛碌,然后在viewController1中又需要把它給展示出來(lái):
[viewController1.navigationControllersetNavigationBarHidden:NOanimated:YES/NO];
這樣使用不僅僅顯得很麻煩勋颖,而且在viewController出現(xiàn)的時(shí)候navigationBar會(huì)出現(xiàn)明顯的閃動(dòng)武福,對(duì)于一個(gè)有強(qiáng)迫癥的人來(lái)說(shuō)淡诗,看著并沒有那么絲滑的感覺了。蘸朋。核无。
于是有了以下的解決辦法:
CWCustomNavigationViewController繼承自:UIViewController
@property(nonatomic,weak)UINavigationController*navController;
-(void)viewWillAppear:(BOOL)animated{? [superviewWillAppear:animated];//很重要,每次要顯示之前都將delegate設(shè)置為自己self.navigationController.delegate=self;? navController=self.navigationController;}
- (void)navigationController:(UINavigationController*)navigationController willShowViewController:(UIViewController*)viewController animated:(BOOL)animated{if(viewController ==self){? ? [navController setNavigationBarHidden:YESanimated:YES];? }else{//不在本頁(yè)時(shí)藕坯,顯示真正的nav bar[navController setNavigationBarHidden:NOanimated:YES];//當(dāng)不顯示本頁(yè)時(shí)团南,要么就push到下一頁(yè),要么就被pop了炼彪,那么就將delegate設(shè)置為nil吐根,防止出現(xiàn)BAD ACCESS//之前將這段代碼放在viewDidDisappear和dealloc中,這兩種情況可能已經(jīng)被pop了辐马,self.navigationController為nil拷橘,這里采用手動(dòng)持有navigationController的引用來(lái)解決if(navController.delegate==self){//如果delegate是自己才設(shè)置為nil,因?yàn)関iewWillAppear調(diào)用的比此方法較早喜爷,其他controller如果設(shè)置了delegate就可能會(huì)被誤傷navController.delegate=nil;? ? }? }}
以上的方法使用的delegate方式解決的冗疮,當(dāng)然也可以使用觀察者模式,觀察UINavigationController的viewcontrollers的變化檩帐,然后進(jìn)行相應(yīng)的處理