iOS-控制器View的创建方式

81 阅读2分钟

不废话,先看示意图 ####1. 控制器View的创建方式流程图 网友总结流程图如下:控制器View创建方式.png

官方示意图如下:官方示意图.jpeg

####2. 代码

  1. 重写了loadveiw
  2. storyboard和xib都没有
  3. 有storyboard
  4. 有指定xib
  5. 有同名xib
  6. 有同名去掉controller的xib
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
         // 创建UIWindow
         self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
         self.window.backgroundColor = [UIColor whiteColor];
        
         //1.重写控制器的loadview方法
         //如果重写了控制器的loadview方法, 就不会去加载创建同名去掉controller的xib和同名的xib, 而是根据loadview里面的描述创建View,如果loadview方法里面没创建,那self.view就是nil
         NJViewController *vc = [[NJViewController alloc] init];

         //2.没有xib和storyboard
         //如果没有xib和storyboard, 会自动创建一个空白的view做为控制器的veiw
         NJViewController *vc = [[NJViewController alloc] init];
    
         //3.有storyboard
         //如果有storyboard,通过storyboard创建, 会创建箭头指向的view做为控制器的view
         //(如果重写了控制器的loadview方法, 就不会创建storyboard中描述的view作为控制器的view, 而是创建一个空白的veiw做为控制器的veiw)
         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"customStorybard" bundle:nil];
         NJViewController *vc = [storyboard instantiateInitialViewController];

         //4.有指定xib
         //如果有指定xib, 会创建指定xib中描述的veiw作为控制器的veiw
         NJViewController *vc = [[NJViewController alloc] initWithNibName:@"customxib" bundle:nil];
   
         //5.有同名xib
         //如果有同名的xib, 会自动找到同名xib中描述的view作为控制器的view
         NJViewController *vc = [[NJViewController alloc] init];

         //6.有同名去掉Controller的xib
         //如果有同名去掉Controller的xib, 会自动找到该xib的view做为控制器的view
         NJViewController *vc = [[NJViewController alloc] init];
    
         // 设置控制器为window的根控制器
         self.window.rootViewController = vc;
         // 显示window
         [self.window makeKeyAndVisible];
         return YES;
     }

关于loadView:

  1. 当控制器需要显示控制器的view的时候就会调用loadView
  2. 一旦重写了loadView方法,就说明要自己定义View.
  3. loadView一般使用的场景:

① 当控制器的View显示的就是一张图片,或者UIWebView,可以节省内存

-(void)loadView {
    UIImageView *imageV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"火影"]];
    imageV.userInteractionEnabled = YES;
    self.view = imageV;
}

② 将View和Controller的代码分离

- (void)loadView{
   [super loadView];
  SecondView *view = [[SecondView alloc] init];
  view.backgroundColor = [UIColor redColor];
  self.view = view;
}

但是怎么监听view里面的属性呢?可以使用KVO。

//SecondView里面有一个skipToThree属性,使用KVO监听它
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addObserverSuny:self keyPath:@"skipToThree" block:^(id newValue) {
     NSLog(@"处理业务");
    }];
}
  • 控制器的view是延迟加载的,用到时再加载
  • 可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
  • 控制器的view加载完毕就会调用viewDidLoad方法