第十四章 创建控制器

控制器常见的创建方式有以下几种

1.控制器常见的创建方式有以下几种

2.直接创建

3.指定xib文件来创建

直接创建

JXViewController *mj = [[JXViewController alloc] init];

通过xib创建控制器

  • 一定要描述xib文件的拥有者为控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    ViewController * viewer = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = viewer;
    [self.window makeKeyAndVisible];
    return YES;
}

这里我们还需要在xib中做一些设置

在xib中拖一个空白的view 设置owner 连线

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


    // 这三个方法运行结果是一样的,因为底层调用的是[[ViewController alloc] initWithNibName:nil bundle:nil];系统会自动调用跟类名相同的xib相同的。

//    ViewController * viewer = [[ViewController alloc] init];
//    ViewController * viewer = [[ViewController alloc] initWithNibName:nil bundle:nil];
    ViewController * viewer = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = viewer;
    [self.window makeKeyAndVisible];
    return YES;
}

// 加载跟类名相同的xib

// 如果描述控制器的view的xib跟控制器的类名相同,就会去加载

// 如果控制器的init方法,底层会调用initWithNibName: bundle:

// 只要通过initWithNibName: bundle:初始化控制器

// 1.寻找有没有跟类名相同,但不带Controller的xib,如果有就会去加载(优先级最高)

// 2.寻找有没有跟类名相同的xib,如果有就加载(优先级次之)

// 3.如果都没有就会创建一个空的view

// viewController:内部实现,在任何地方调用self.view的时候回先调用这个懒加载方法。所以有时候在viewDidLoad中设置view可能不会正确的显示
- (UIView *)view {
    if (_view == nil) {
        [self loadView];
        [self viewDidLoad];
    }
    return _view;
}
// 在viewDidLoad打印控制器的尺寸是不准确的,通常在viewDidAppear中显示
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}

通过storyboard创建控制器

  • 先加载storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
  • 接着初始化storyboard中的控制器

    • 初始化“初始控制器”(箭头所指的控制器)

      JXViewController *jx = [storyboard instantiateInitialViewController];
      
    • 通过一个标识初始化对应的控制器

      JXViewController *mj = [storyboard instantiateViewControllerWithIdentifier:@”JX"];
      

ViewController的View创建

控制器view的延迟加载

  • 控制器的view是延迟加载的:用到时再加载

  • 可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载

  • 控制器的view加载完毕就会调用viewDidLoad方法

多控制器

  • 一个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

results matching ""

    No results matching ""