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。

相关文章
相关标签/搜索