天天看點

Storyboard和XIB加載控制器及控制器View的生命周期

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;
}
           
Storyboard和XIB加載控制器及控制器View的生命周期

3.Storyboard之間的跳轉

  • 控制器之間的跳轉,從圖上可以看到,

    segue

    的選中時,是從

    源控制器

    要跳轉到

    目标控制器

  • 給每一個

    segue

    綁定一個跳轉的

    辨別

    ,藍色的控制是的

    辨別是oneVC

    ,粉色控制器的

    辨別是twoVC

    Storyboard和XIB加載控制器及控制器View的生命周期
  • 當我點選

    跳轉

    按鈕,我要選擇判斷要跳轉到哪一個控制器
//跳轉控制器
- (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 如下圖:

Storyboard和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

    檔案控制器
Storyboard和XIB加載控制器及控制器View的生命周期
  • init

    加載
    Storyboard和XIB加載控制器及控制器View的生命周期
    Storyboard和XIB加載控制器及控制器View的生命周期

xib的加載原理

  • 通過

    initWithNibName:bundle:

    直接加載xib檔案,不管xib檔案與類名是否相同
  • 通過

    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

的生命周期

- (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;
}
           
我們可以通過

loadView

,來定義我們自已的使用的控制器View,比如:直接建立使用

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的生命周期方法的調用情況
    Storyboard和XIB加載控制器及控制器View的生命周期
其實在控制器中,我們可以通過

isViewLoaded

方法,看view是不是已經加載,

[self isViewLoaded]

,這個

父子

控制使用的時候,經常使用這個方法,來判斷控制器的

view

是否已經加載