標籤:
1、如何建立一個控制器
控制器常見的建立方式有以下幾種:
(1)通過storyboard建立
(2)直接建立
MJViewController *mj = [[MJViewController alloc] init];
(3)指定xib檔案來建立
MJViewController *mj = [[MJViewController alloc] initWithNibName:
@"MJViewController" bundle:nil];
注意,建立xid後還要設定xid中哪個view是ControllerView的view(而用storyboard建立控制器卻不用設定因為系統已經自動化佈建過了),設定方法為:
首先把File`s Owner設定為控制器,如:
表示這個xid檔案是為哪個類(控制器)服務的。任何視圖(比如UIView、xid、storyboard等)設定了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方法。
3、 多控制器
一個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");
}
/**
* view從window上完全移除(完全看不見)
*
*/
- (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。
iOS開發之控制器建立與載入(生命週期)