iOS開發UI篇—使用storyboard建立導航控制器以及控制器的生命週期

iOS開發UI篇—使用storyboard建立導航控制器以及控制器的生命週期ios

1、基本過程windows

新建一個項目,系統默認的主控制器繼承自UIViewController,把主控制器兩個文件刪掉。app

在storyboard中,默認的控制器是View Controller,而咱們須要的是導航控制器,那麼就把系統的給刪掉,拖一個導航控制器進來,導航控制器中默認的第一個子控制器是一個tableview controller,這裏不須要,把它刪掉,從新拖三個View Controller到界面上進行連線,簡單的設置就能夠了。atom

          

按鈕連線,按住ctrl,右邊界面選擇push。spa

  

完成基本設置後的界面以下:3d

通過這麼幾步簡單的設置,就能夠實現一個簡單的多頁面切換。爲開發提供了極大的方便,但storyboard也不是萬能的,要注意在開發中,若是在最後一個頁面添加一個按鈕,讓它直接跳轉到上一個頁面會出現問題。代理

提示:storyboard能作的事情,使用代碼都能作,可是代碼可以作的事情,storyboard不必定可以作。code

經過拖拉控件便可完成簡單的界面設置。blog

下面這樣的連線會出現問題:(從後面的控制器跳轉到前面,只能經過代碼來實現)繼承

產生問題的緣由:(當點擊返回的時候,不是先把第三個控制器移除棧頂,而是先建立TWO控制器,此時棧裏有四個控制器,棧頂的爲TWO).

 

2、控制器的生命週期

代碼簡單說明:

複製代碼
 
 

@interface NJOneViewController ()

@property (nonatomic, strong) NSArray *foods;
@end

@implementation NJOneViewController

// 當控制器的view加載完畢就調用
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1控制器的view加載完畢");
}

// 控制器的view即將顯示的時候調用
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
NSLog(@"1控制器的view即將顯示");
}

// 控制器的view徹底顯示的時候調用
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"1控制器的view徹底顯示");
}

// 控制器的view即將消失的時候調用
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"1控制器的view即將消失");
}
// 控制器的view徹底消失的時候調用
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"1控制器的view徹底消失");
}

// 控制器的view即將銷燬的時候調用
- (void)viewWillUnload
{
[super viewWillUnload];
}
// 控制器的view徹底銷燬的時候調用
- (void)viewDidUnload
{
[super viewDidUnload];
// 清空不須要的屬性
// [self.foods release];
self.foods = nil;
}

//- (void)setFoods:(NSArray *)foods
//{
// if (_foods != foods) {
// [foods release];
// _foods = [foods retain];
// }
//}

// 接收到內存警告的時候調用
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
/**/

@end

複製代碼

打印結果以下

三個重要的方法:

複製代碼

// 控制器的view即將銷燬的時候調用
- (void)viewWillUnload
{
[super viewWillUnload];
}
// 控制器的view徹底銷燬的時候調用
- (void)viewDidUnload
{
[super viewDidUnload];
// 清空不須要的屬性
// [self.foods release];
self.foods = nil;
}

// 接收到內存警告的時候調用
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

複製代碼

補充:

兩個內存警告的區別(和代理中得比較):

代理的內存警告:當application發生一些事情的時候(接收到內存警告的時候),會先通知它的代理,以後代理會通知它的window,window會通知它的根控制器,根控制器會通知它的子控制器。內存警告是由上往下一層一層往下傳的(能夠經過在兩個地方打印輸出驗證)。

須要瞭解它的父類是如何處理內存警告的。

模擬內存警告:

內存警告的處理示意圖:

控制器的view是否能夠銷燬?它怎麼知道是否能夠銷燬呢?如何判斷?它是判斷這個view是不是在windows上面。

當前one控制器在棧頂,one控制器對應的view顯示在window上,若是此時發生內存警告,那麼one由於在window上面,因此不會被銷燬。

若此時再來一個two控制器,它建立對應的twoview顯示到window上,one對應的view移開了,此時若是發生內存警告,則此時oneview已經再也不在window上顯示,因此會被銷燬。

特別說明:outlet表明着屬性,當控制器建立的時候,屬性通常也是有值的,當調用了- (void)viewDidUnload方法之後,即控制器的view徹底銷燬了之後,全部的屬性數據會清空。通常在ios5之前,還會在這個方法裏面清空裏面的全部屬性。

提示:全部的控制器的這些方法實際上是一個循環。

相關文章
相關標籤/搜索