iOS 隱藏/出現 navigationBar

一個蘿蔔壹個坑發表於2017-12-22

客戶端在開發過程中經常用到UINavigationController,在使用UINavigationController過程中可能會有一下場景:

viewController1是有navigationBar的,而viewController2需要隱藏navigationBar,在viewController2中呼叫:

[viewController2.navigationControllersetNavigationBarHidden:YESanimated:YES/NO];

即可隱藏navigationBar,然後在viewController1中又需要把它給展示出來:

[viewController1.navigationControllersetNavigationBarHidden:NOanimated:YES/NO];

這樣使用不僅僅顯得很麻煩,而且在viewController出現的時候navigationBar會出現明顯的閃動,對於一個有強迫症的人來說,看著並沒有那麼絲滑的感覺了。。。

於是有了以下的解決辦法:

CWCustomNavigationViewController繼承自:UIViewController

@property(nonatomic,weak)UINavigationController*navController;

-(void)viewWillAppear:(BOOL)animated{  [superviewWillAppear:animated];//很重要,每次要顯示之前都將delegate設定為自己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{//不在本頁時,顯示真正的nav bar[navController setNavigationBarHidden:NOanimated:YES];//當不顯示本頁時,要麼就push到下一頁,要麼就被pop了,那麼就將delegate設定為nil,防止出現BAD ACCESS//之前將這段程式碼放在viewDidDisappear和dealloc中,這兩種情況可能已經被pop了,self.navigationController為nil,這裡採用手動持有navigationController的引用來解決if(navController.delegate==self){//如果delegate是自己才設定為nil,因為viewWillAppear呼叫的比此方法較早,其他controller如果設定了delegate就可能會被誤傷navController.delegate=nil;    }  }}

以上的方法使用的delegate方式解決的,當然也可以使用觀察者模式,觀察UINavigationController的viewcontrollers的變化,然後進行相應的處理

相關文章