zoukankan      html  css  js  c++  java
  • iOS开发之控制器创建与加载(生命周期)

    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文件是为哪个类(控制器)服务的。任何视图(比如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方法。

    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");

    }

    /**

     *  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。

  • 相关阅读:
    Java实现埃拉托色尼筛选法
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现希尔排序
    Java实现插入排序
    Java实现插入排序
    Java实现插入排序
    使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)
  • 原文地址:https://www.cnblogs.com/lifengfneg/p/4773881.html
Copyright © 2011-2022 走看看