UIStoryboard加載控制器
1.加載箭頭指向的控制器
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//建立 UIStoryboard對象
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加載指定箭頭的控制器
UIViewController *rootVC = [sb instantiateInitialViewController];
self.window.rootViewController = rootVC;
[self.window makeKeyAndVisible];
2.加載帶有辨別(Identity)的控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//建立 UIStoryboard對象
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加載指定箭頭的控制器
UIViewController *rootVC = [sb instantiateViewControllerWithIdentifier:@"testSB"];
self.window.rootViewController = rootVC;
[self.window makeKeyAndVisible];
return YES;
}
3.Storyboard之間的跳轉
- 控制器之間的跳轉,從圖上可以看到,
的選中時,是從segue
要跳轉到源控制器
目标控制器
- 給每一個
綁定一個跳轉的segue
,藍色的控制是的辨別
,粉色控制器的辨別是oneVC
辨別是twoVC
- 當我點選
按鈕,我要選擇判斷要跳轉到哪一個控制器跳轉
//跳轉控制器
- (IBAction)handleSelectController:(UIButton *)sender {
if ([self.isSelectStr isEqualToString:@"oneVC"]) {
[self performSegueWithIdentifier:@"oneVC" sender:nil];
}else {
[self performSegueWithIdentifier:@"twoVC" sender:nil];
}
}
-
方法内部會調用下面的一個方法performSegueWithIdentifier: sender:
//調用這個方法傳值
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
// segue.sourceViewController h擷取到的是源控制器
//目标控制器
CCOneVC *oneVC = segue.destinationViewController;
oneVC.targetStr = @"這個是一個傳值的屬性";
}
- 是以,一般在
跳轉,要傳值的話,就調用這個方法,根據segue
的不同,給不同的控制器,傳值辨別
XIB加載控制器
建立CCXIBVC檔案
建立XIB檔案,綁定控制器,脫線到View 如下圖:
- 加載不同名的xib檔案控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
CCXibVC *xibVC = [[CCXibVC alloc] initWithNibName:@"xib" bundle:nil];
self.window.rootViewController = xibVC;
[self.window makeKeyWindow];
return YES;
}
- 加載同名的
檔案控制器xib
-
加載init
xib的加載原理
xib的加載原理
- 通過
直接加載xib檔案,不管xib檔案與類名是否相同initWithNibName:bundle:
- 通過
加載init
1.底層會調用
init
initWithNibName:bundle:
方法
2.當
initWithNibName:bundle:
初始化控制器,并且nibName為nil時,系統就會執行下面的操作
2.1,尋找有沒有跟控制器類名同名但是不帶Controller的xib,如果有就會去加載(CCRootView.xib)
2.2尋找有沒有跟控制器類名同名的xib,如果有就會去加載(CCRootViewController.xib)
2.3如果上述的2個都沒有找到,就會建立一個
空白的View
控制器 View
的生命周期
View
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
CCXibVC *xibVC = [[CCXibVC alloc] initWithNibName:@"xib" bundle:nil];
self.window.rootViewController = xibVC;
[self.window makeKeyWindow];
return YES;
return YES;
}
從上面的代碼中,我們可以知道,控制器建立成功
控制器建立成功之後,要怎麼做呢?
1- 控制器建立成功之後,系統建立一個,調用
view
方法
- (void)loadView;
- (void)loadView;
方法其實是一個懶加載,在建立
view
之後,會調用
viewDidLoad
方法
這個方法的内部實作如下:
- (UIView *)view{
if (!_view) {
_view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self viewDidLoad];
}
return _view;
}
我們可以通過,來定義我們自已的使用的控制器View,比如:直接建立使用
loadView
,或者
scrollView
UIImageView
2 - viewDidLoad
控制器View加載完畢的時候調用
- (void)viewDidLoad {
[super viewDidLoad];
}
3- 控制器View将要顯示的時候調用,下面的方法
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
4-控制器的View的顯示完畢的時候調用
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
5-控制器View的将要消失的時候調用
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}
6- 控制器View已經消失的時候調用
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidAppear:animated];
}
7- 控制器的View将要布局子控件的時候調用 , 控制器View布局子控件完畢的時候調用,這個2個方法調用的比較頻繁 隻要有子控件添加就會調用 ()
//控制器的View将要布局子控件的時候調用
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
}
//控制器View布局子控件完畢的時候調用
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
}
8-記憶體警告的時候
- (void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
}
9- 下面這個2個方法,是在使用調用,不過現在已經
mrc(手動管理記憶體)
,已經被廢棄了
ARC(系統幫你管理記憶體)
//view将要銷毀
- (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0) __TVOS_PROHIBITED;
//view已經銷毀
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0) __TVOS_PROHIBITED;
- View的生命周期方法的調用情況
其實在控制器中,我們可以通過方法,看view是不是已經加載,
isViewLoaded
,這個
[self isViewLoaded]
控制使用的時候,經常使用這個方法,來判斷控制器的
父子
是否已經加載
view