zoukankan      html  css  js  c++  java
  • 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的方法和选择过程

  • 相关阅读:
    函数
    2017-12-09 JavaScript实现ZLOGO子集: 测试用例
    2017-12-06 JavaScript实现ZLOGO子集: 单层循环功能
    2017-12-05 JavaScript实现ZLOGO子集: 前进+转向
    Python3选择支持非ASCII码标识符的缘由
    2017-12-04 编写Visual Studio Code插件初尝试
    2017-12-02 编程语言试验之Antlr4+JavaScript实现"圈4"
    2017-12-01 中英文代码对比之ZLOGO 4 & LOGO
    2017-11-28 在线编程网站对中文代码的支持
    中文编程兴起的可能途径
  • 原文地址:https://www.cnblogs.com/luseike/p/3773878.html
Copyright © 2011-2022 走看看