对于很多程序员来说控制器和View的关系肯定有点模糊,对于View的创建肯定有一种说不清道不明的感觉。view只是控制器的一个属性,控制器中有许多对view处理的方法,也就是说得控制器管理view的业务。
通常有三种方式通过控制器来产生view:
<1>. 纯代码
<2>.通过storyboard方式加载控制器中的view
<3>.通过xib方式加载控制器中的view
通过下图通过YBViewContoller控制器view的产生可以明了的了解view的产生方式:
在这里我们应该明了不管xib或者storyboard创建控制器,我们必须对此绑定一个类(在这里以绑定YBViewContoller控制器为例简要说明 )
无论控制器是如何创建的,控制器肯定属于一个类(在这里YBViewContoller控制器),类里面的loadView就能判断view以哪种方式加载view
首先将三种创建控制器的方法代码写出来:
// 1.纯代码
YBViewController *viewCtr = [[YBViewController alloc] init];
// 2.storyboard
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YBViewController" bundle:nil];
YBViewController *storyCtr = [storyboard instantiateInitialViewController];
// 3.xib
YBViewController *xibCtr = [[YBViewController alloc] initWithNibName:@"YBViewController" bundle:nil];
self.window.rootViewController = xibCtr;
我们就仔细梳理一番,通过三种方式只是创建YBViewController控制器,如何加载出view,就是loadView方法的事情了,如果在这个类中重写的 loadView方法自定义View的话,这个控制器加载的view就是自定的view,与加载控制器的方法无关,如果没有重写loadView的方法是怎样加载控制器的view?在控制器中有两个属性:
@property(nullable, nonatomic, readonly, copy) NSString *nibName; @property(nullable, nonatomic, readonly, strong) UIStoryboard *storyboard
当我们想用storyboard加载控制器时,传入storyboard的名字赋值给UIStoryboard属性,加载view时就会加载这个storyboard中控制器的view,同理通过xib加载时的道理也是一样的。