iOS開發之控制器建立與加載(生命週期)

1、如何建立一個控制器app

控制器常見的建立方式有如下幾種:繼承

(1)經過storyboard建立生命週期

(2)直接建立事件

MJViewController *mj = [[MJViewController alloc] init];內存

(3)指定xib文件來建立it

MJViewController *mj = [[MJViewController alloc] initWithNibName:io

@"MJViewController" bundle:nil];class

注意,建立xid後還要設置xid中哪一個view是ControllerView的view(而用storyboard建立控制器卻不用設置由於系統已經自動設置過了),設置方法爲:方法

首先把File`s Owner設置爲控制器,以下圖:im

表示這個xid文件是爲哪一個類(控制器)服務的。任何視圖(好比UIViewxidstoryboard等)設置了class,都表明那個視圖是爲那個類服務的,即從那個類中操做這個視圖中的控件或初始化這個視圖等。

而後設置控制器的view是哪一個view,方法爲右鍵File`s Owner拖view選項到相關view上,以下圖:

若是在建立繼承ViewController的類時勾選下面選項就能夠省略這個步驟(會自動建立xid文件並自動完成上述步驟):

經過xid建立控制器時,若是新建的控制器名稱和xid文件的名稱同樣,則能夠經過如下三種方式將它設置爲rootViewController:

方式一:

self.window.rootViewController =

[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

 

方式二:

self.window.rootViewController = [[MJViewController alloc] initWithNibName:nil bundle:nil];

這裏將initWithNibName參數設置爲nil,等價於方法三,首先會去找文件名爲MJView.xid的做爲初始化時的xid文件,若是沒找到MJView.xid文件,則會去尋找文件名爲MJViewController.xid的做爲初始化的xid文件。

 

方式三:

self.window.rootViewController = [[MJViewController alloc] init];

【備註】蘋果官方推薦在控制器的ViewLoad方法中建立控制器的view。

2、經過storyboard建立控制器詳解

(1)先加載storyboard文件(Test是storyboard的文件名)

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

(2)接着初始化storyboard中的控制器

初始化「初始控制器」(箭頭所指的控制器)

MJViewController *mj = [storyboard instantiateInitialViewController];

經過一個標識初始化對應的控制器

MJViewController *mj =

[storyboard instantiateViewControllerWithIdentifier:@」mj"];

 

例如,新建storyboard文件(two. storyboard),向裏面拖入一個ViewController,如何將這個storyboard文件中的ViewController顯示到UIWindow呢?

首先,要加載這個storyboard:

UIStoryboard *storyboard =

[UIStoryboard storyboardWithName:@"Two" bundle:nil];

而後使用這個storyboard建立ViewController,如今咱們新建一個類MJTwoViewController,它繼承自ViewControlle,而後:

MJTwoViewController *vc = [storyboard instantiateInitialViewController];

最後將這個控制器設置爲rootViewController便可:

self.window.rootViewController = vc;

若是storyboard中有多個ViewController,可使用下列方法加載指定ViewController:

MJTwoViewController *vc =

[storyboard instantiateViewControllerWithIdentifier:@"myID"];

若是咱們想爲storyboard中ViewController中的控件設置事件,好比按鈕點擊事件,咱們只需往MJTwoViewController中拖線並實現相應方法便可。

3、控制器view的加載

 

控制器的view是延遲加載的:用到時再加載。

能夠用isViewLoaded方法判斷一個UIViewController的view是否已經被加載。

控制器的view加載完畢就會調用viewDidLoad方法。

三、         多控制器

一個iOS的app不多隻由一個控制器組成,除非這個app極其簡單。當app中有多個控制器的時候,咱們就須要對這些控制器進行管理。有多個view時,能夠用一個大的view去管理1個或者多個小view。控制器也是如此,用1個控制器去管理其餘多個控制器。

好比,用一個控制器A去管理3個控制器B、C、D:控制器A被稱爲控制器B、C、D的「父控制器」。控制器B、C、D的被稱爲控制器A的「子控制器」。

爲了便於管理控制器,iOS提供了2個比較特殊的控制器:

UINavigationController

UITabBarController

5、控制器的生命週期

/**

 *  view加載完畢

 */

- (void)viewDidLoad

{

    [super viewDidLoad];

   

    NSLog(@"MJOneViewController-viewDidLoad");

}

 

/**

 *  view即將顯示到window

 *

 */

- (void)viewWillAppear:(BOOL)animated

{

    [super viewWillAppear:animated];

   

    NSLog(@"MJOneViewController-viewWillAppear");

}

 

/**

 *  view顯示完畢(已經顯示到窗口)

 */

- (void)viewDidAppear:(BOOL)animated

{

    [super viewDidAppear:animated];

   

    NSLog(@"MJOneViewController-viewDidAppear");

}

 

/**

 *  view即將從window上移除(即將看不見)

 *

 */

- (void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:animated];

   

    NSLog(@"MJOneViewController-viewWillDisappear");

}

 

/**

 *  viewwindow上徹底移除(徹底看不見)

 *

 */

- (void)viewDidDisappear:(BOOL)animated

{

    [super viewDidDisappear:animated];

   

    NSLog(@"MJOneViewController-viewDidDisappear");

}

 

/**

 *  view即將銷燬的時候調用

 */

- (void)viewWillUnload

{

    [super viewWillUnload];

}

 

/**

 *  view銷燬完畢的時候調用

 */

- (void)viewDidUnload

{

    [super viewDidUnload];

}

 

/**

 *  當接收到內存警告的時候

 */

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

 

}

【備註】控制器中還有一個方法:

— (void)loadView;

這個方法是加載控制器中的View時候調用的,一般咱們靠重寫這個方法去改變控制器的View。

相關文章
相關標籤/搜索