iOS-控制器的创建方式

217 阅读3分钟

控制器的创建方式分为三种:

  1. 使用代码直接创建
  2. 使用storyboard创建
  3. 使用xib创建

##一.使用代码创建

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    //创建控制器
    YYViewController *controller=[[YYViewController alloc]init];

    //设置控制器View的背景颜色
    controller.view.backgroundColor=[UIColor brownColor];
    //设置该控制器为Window的根控制器
    self.window.rootViewController = controller;
    [self.window makeKeyAndVisible];
    return YES;
}

##二.通过storyboard创建

  1. 添加一个storyboard文件,命名为customStoryboard,在界面上拖一个view controller控制器。
  2. 设置这个控制器和程序中的YYviewController类进行关联,设置控制器view的颜色以便区分。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    //1.加载storyboard,(注意:这里仅仅是加载名称为customStoryboard的storyboard,并不会创建storyboard中的控制器和控件)
    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"customStoryboard" bundle:nil];
    //2.下面这个方法代表着创建storyboard中箭头指向的控制器(初始控制器)
    YYViewController *controller=[storyboard instantiateInitialViewController];

    //3.设置控制器为Window的根控制器
    self.window.rootViewController = controller;
    [self.window makeKeyAndVisible];
    return YES;
}
  • 补充:

新的需求:如果在一个storyboard中有多个控制器,如何指定创建哪个特定的控制器呢? 这里有两种方法:

  1. 更改初始控制器,即把箭头拖拽到想要创建的控制器前面,然后使用上面的代码创建
  2. 通过设置storyboard id 唯一的标识符来创建指定的控制器,代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    //1.加载storyboard
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"customStoryboard" bundle:nil];
    //2.创建指定的控制器
    UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"your storyboard id"];

    //3.设置控制器为Window的根控制器
    self.window.rootViewController = controller;
    [self.window makeKeyAndVisible];
    return YES;
}

##三.使用xib创建

新建一个xib文件,命名为custom.xib, 在xib中拖入一个view

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    //1.通过xib创建控制器
    YYViewController *controller=[[YYViewController alloc]initWithNibName:@"custom" bundle:nil];

    //2.设置这个控制器为Window的根控制器
    self.window.rootViewController=controller;
    [self.window makeKeyAndVisible];
    return YES;
}
  • 关于控制器View的创建方式
  1. 如果有指定的xib,会加载指定的xib
  2. 如果没有指定xib 1.如果有同名xib,自动加载跟它同名的xib(XMGViewController.xib) 2.如果没有同名xib,自动加载跟它同名并且是去掉controller的xib(XMGView.xib)
  3. init底层自动调用initWithNibName
  4. 更多关于控制器View的创建方式可参考:iOS控制器View的创建方式
  • 两个错误注意点
  1. 不能加载(was unable to load a nib named "two") 产生原因:在xib文件中没有进行任何操作。 解决方法:往xib中拖一个view

  2. 加载了xib,但是没有设置输出口(loaded the "two" nib but the view outlet was not set.') 产生原因:没有把xib的view设置为YYViewController的view 解决方法:设置File‘s Owner,可以理解为设置这个文件归谁所有,对File‘s Owner和view进行连线。连线是因为一个xib中可能会有多个view,在storyboard中默认就已经进行了连线