• IOS中UIViewController的创建


    IOS程序中,一个应用默认只有一个UIWindow。UIWindow是比较特殊的UIView控件,也是程序启动后创建的第一个UIView对象,为了透彻的了解UIWindow和UIViewController之间的关系,以及UIViewController的创建,从新建一个EmptyApplication工程开始。

    Empty的工程,默认的目录结构中只有AppDelegate类,这个类是Application对象的委托,会在程序不同的生命周期中回调不同的方法(关于application生命周期的话题,等我学习好了在嘚瑟……)didFinishLaunchingWithOptions中的代码如下

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    

     可以看到程序已启动,AppDelegate对象会创建一个UIWindow对象,并设置window的背景色为白色,然后通过makeKeyAndVisible使其可见并成为主窗口,直接运行就看到一个白色的区域展现眼前。界面上的所有UI元素,如果想要展示出来,都必须依托UIWindow对象,没有指定UIWindow的UIView时,它会自动生成一个UIView对象。创建UIViewController大致有自定义直接创建、通过storyboard创建和使用Xib文件创建。

    1、直接创建:

     //创建控制器
         ViewControllerTest *vc=[[ViewControllerTest alloc] init];
         vc.view.backgroundColor=[UIColor purpleColor];
         UISwitch *s=[[UISwitch alloc] init];
         [vc.view addSubview:s];
         //将控制器的View添加到window上的方法有个弊端
         //当发生旋转事件时,UIApplication对象会将旋转事件传递给UIWindow,UIWindow会将其传递给它的跟控制器,由跟控制器决定是否需要旋转
         //所以一般建议将自己创建的viewcontroller以window跟控制器的方式设置
         
         //[self.window addSubview:vc.view];
         self.window.rootViewController=vc;
         //让创建的UIWindow成为主窗口并显示出来
         [self.window makeKeyAndVisible];
    

     直接实例化一个UIViewController的对象,设置为window的根控制器,这里我设置实例化的ViewController的View背景色为紫色,运行就显示紫色,而且我添加上去的switch控件也能够随手机屏幕的转动而旋转。

    需要注意的是如果有两个window对象,在IOS7之前,只有主窗口的控制器里面的控件能够交互,但是在IOS7,不管你是不是主窗口,都能够正常使用里面的控件。

    2、通过storyboard创建UIViewController

    //通过加载storyboard创建ViewController
        //仅仅是加载了名为Storyboard的storyboard,并不会创建Storyboard中的控制器以及控件
        UIStoryboard *sb=[UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
        //创建Storyboard中箭头指向的控制器
        ViewControllerTest *vc=[sb instantiateInitialViewController];
        self.window.rootViewController=vc;
        
        ViewControllerTest *vc2=[sb instantiateViewControllerWithIdentifier:@"two"];
        self.window.rootViewController=vc2;
        [self.window makeKeyAndVisible];
    

     通过storyboard创建,先受用storyboardWithName方法找到指定名字的storyboard对象,这里只是加载了这个storyboard,还没有创建任何UI元素呢哦……然后通过instantiateInitialViewController方法,该方法创建了故事板中箭头指向的那个控制器对象。一个故事板中当然可以包括很多的控制器对象,如果想要创建指定的控制器对象,一般使用instantiateViewControllerWithIdentifier方法,指定控制器的storyboard id就搞定了。如上代码我创建了两个控制器

    3、通过xib文件创建UIViewController

    xib是storyboard的前身,都是对界面布局的描述文件,故而可以通过xib文件进行创建

    ViewControllerTest *vc=[[ViewControllerTest alloc] initWithNibName:@"One" bundle:nil];
        self.window.rootViewController=vc;
    

     这种方式的代码就简单多了,只需要在实例化控制器对象的initWithNibName方法中,指定xib文件名即可,只是有一点需要注意,就是指定的xib文件一定要继承实例化的ViewController对象,也就是指定xib文件的custom class对象为代码中的ViewControllerTest对象即可。

    最后需要说明的是,如果一旦重写了ViewController的loadView方法,那么不论通过哪种方法创建UIViewController都白费了。

    最后附上一张图,完整的说明各种创建ViewController的方法和选择过程

  • 相关阅读:
    【转】【人在职场】能力与价值
    【转】小议Bug敏感度---Bug敏感度的故事(一)
    【转】请尊重测试:测试从业五年有感
    【转】性能测试设计和LR原理的探讨
    【转】企业级Java应用最重要的4个性能指标
    暂存
    存储过程参数输入输出
    sqlserver 分页
    学习网址
    daatable动态创建
  • 原文地址:https://www.cnblogs.com/luseike/p/3773878.html
Copyright © 2020-2023  润新知