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


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

一、基本過程

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

在storyboard中,默認的控制器是View Controller,而我們需要的是導航控制器,那么就把系統的給刪掉,拖一個導航控制器進來,導航控制器中默認的第一個子控制器是一個tableview controller,這里不需要,把它刪掉,重新拖三個View Controller到界面上進行連線,簡單的設置就可以了。

          

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

  

完成基本設置后的界面如下:

經過這么幾步簡單的設置,就可以實現一個簡單的多頁面切換。為開發提供了極大的方便,但storyboard也不是萬能的,要注意在開發中,如果在最后一個頁面添加一個按鈕,讓它直接跳轉到上一個頁面會出現問題。

提示:storyboard能做的事情,使用代碼都能做,但是代碼能夠做的事情,storyboard不一定能夠做。

通過拖拉控件即可完成簡單的界面設置。

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

產生問題的原因:(當點擊返回的時候,不是先把第三個控制器移除棧頂,而是先創建TWO控制器,此時棧里有四個控制器,棧頂的為TWO).

 

二、控制器的生命周期

代碼簡單說明:

 1 @interface NJOneViewController ()
 2 
 3 @property (nonatomic, strong) NSArray *foods;
 4 @end
 5 
 6 @implementation NJOneViewController
 7 
 8 // 當控制器的view加載完畢就調用
 9 - (void)viewDidLoad
10 {
11     [super viewDidLoad];
12     NSLog(@"1控制器的view加載完畢");
13 }
14 
15 // 控制器的view即將顯示的時候調用
16 - (void)viewWillAppear:(BOOL)animated
17 {
18     [super viewWillAppear:YES];
19     NSLog(@"1控制器的view即將顯示");
20 }
21 
22 // 控制器的view完全顯示的時候調用
23 - (void)viewDidAppear:(BOOL)animated
24 {
25     [super viewDidAppear:animated];
26     NSLog(@"1控制器的view完全顯示");
27 }
28 
29 // 控制器的view即將消失的時候調用
30 - (void)viewWillDisappear:(BOOL)animated
31 {
32     [super viewWillDisappear:animated];
33     NSLog(@"1控制器的view即將消失");
34 }
35 // 控制器的view完全消失的時候調用
36 - (void)viewDidDisappear:(BOOL)animated
37 {
38     [super viewDidDisappear:animated];
39     NSLog(@"1控制器的view完全消失");
40 }
41 
42 // 控制器的view即將銷毀的時候調用
43 - (void)viewWillUnload
44 {
45     [super viewWillUnload];
46 }
47 // 控制器的view完全銷毀的時候調用
48 - (void)viewDidUnload
49 {
50     [super viewDidUnload];
51     // 清空不需要的屬性
52 //    [self.foods release];
53     self.foods = nil;
54 }
55 
56 //- (void)setFoods:(NSArray *)foods
57 //{
58 //    if (_foods != foods) {
59 //        [foods release];
60 //        _foods = [foods retain];
61 //    }
62 //}
63 
64 // 接收到內存警告的時候調用
65 - (void)didReceiveMemoryWarning
66 {
67     [super didReceiveMemoryWarning];
68 }
69  /**/
70 
71 @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以前,還會在這個方法里面清空里面的所有屬性。

提示:所有的控制器的這些方法其實是一個循環。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM