ios 關於navigationController導航欄隱藏問題

NavigationController導航欄設置隱藏,不知道你有沒有嘗試過下面這個方法。

self.navigationController.navigationBarHidden = YES;

在viewDidLoad這個方法裏寫的話,確實是把導航欄隱藏了,但是你有沒發現,當你點擊返回上一級的按鈕時,上一級的導航欄也沒有了。。。

這是爲什麼呢?這就需要你瞭解一下viewController的生命週期了

一、什麼是ViewController的生命週期 (摘抄自http://www.cnblogs.com/xiaofeixiang/p/4387388.html?utm_source=tuicool&utm_medium=referral)

ViewController在App開發中是至關重要的一環,無論是頁面的展示和數據之間的交互,ViewController提供了一個框架可以管理和構建App應用。iOS中構建App提供了兩種方式一種是ViewController管理比如NavigationController和UITabBarController,另外一種就是我們經常打交道用到的自定義ViewController或者是常用UITableViewController展示我們需要的數據。下面這種蘋果官網的圖片可以加強理解:


生命週期(LifeCircle)

視圖的生命週期其實可以理解爲Load-Present-Hidden(加載-展現-隱藏)三個階段,如果從ViewController中方法中執行的順序來看,順序應該是這樣的:

loadView→viewDidLoad→viewWillAppear→viewDidAppear→viewWillDisappear→viewDidDisappear→dealloc

loadView:一般情況下不用用到,除非需要重寫設置View;

viewDidLoad/dealloc:視圖加載完成之後的設置和視圖銷燬的時候調用;

viewWillAppear/viewWillDisappear:視圖即將呈現和視圖即將消失;

viewDidAppear/viewDidDisappear:視圖展現在屏幕的時候和視圖完全消失在屏幕的時候調用,默認不做任何操作;

如果看生命週期的話,網上有很張類似這樣的圖,具體可以參考下,來源於蘋果官網:


可以重寫代碼看下效果:

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  NSLog(@"viewDidLoad-keso");
}
-(void)viewWillAppear:(BOOL)animated{
  NSLog(@"viewWillAppear-FlyElephant");
}
-(void)viewDidAppear:(BOOL)animated{
  NSLog(@"viewDidAppear");
}
-(void)viewWillDisappear:(BOOL)animated{
  NSLog(@"viewWillDisappear");
}
-(void)viewDidDisappear:(BOOL)animated{
  NSLog(@"viewDidDisappear-http://www.cnblogs.com/xiaofeixiang/");
}

viewWillLayoutSubviews和 viewDidLayoutSubviews如果使用到自動佈局,需要修改自動佈局中的約束條件,那麼可以在viewWillLayoutSubviews中進行操作,最近遇到一個就是text文本框中文字過多的時候文字不能不能置頂,可以在viewWillDidSubviews中操作:

- (void)viewDidLayoutSubviews {
    [self.myTextView setContentOffset:CGPointZero animated:NO];
}

生命週期中幾個方法的調用實際中需要看自己的操作,在正確的地方做正確的事,會事半功倍的,具體需要看自己的熟悉程度~

二、viewController生命週期和NavigationController導航欄的關係 (我不太擅長詳細的語言描述,只是把自己隱藏導航欄的過程和錯誤展現一下)

1、剛開始的時候我是在push之前self.navigationController.navigationBarHidden = YES;發現什麼效果都沒有。。。



2.然後我就百度了一下,發現有說在viewdidappear方法或者viewWillAppear
中寫self.navigationController.navigationBarHidden = YES;然後我就試了一下,發現,導航欄消失是消失了,但是返回上一級時,上一級的導航欄也沒了。。。


然後又去百度,谷歌,有自己嘗試了一下。。。發現了viewcontroller證明週期的神奇之處。。。

就是在viewWillAppear方法和viewWillDisappear方法中寫上隱藏導航欄和顯示導航欄,這兩個方法是什麼意思呢,我第一步已經詳細的寫過了,不過在這裏我重新再說一下:

(1)、viewWillAppear方法:視圖即將呈現時隱藏 self.navigationController.navigationBarHidden = YES;

(2)、viewWillDisappear方法:視圖即將消失顯示 self.navigationController.navigationBarHidden = NO;


這樣,就很好的解決導航欄隱藏的問題了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章