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的方法和选择过程

posted @ 2014-06-07 00:07  luseike  阅读(1394)  评论(0编辑  收藏  举报