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;
這樣,就很好的解決導航欄隱藏的問題了