控制器view的多种创建方式
控制器View的多种创建方式
首先需要自定义控制器view,作为根控制器通过没有没有同名的xib情况下alloc init创建的View
JHViewController* vc = [[JHViewController alloc] init];
- 结果:View的样式是空白的(透明)
通过storyb创建,箭头所指向的控制器
UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; JHViewController* vc = [sb instantiateInitialViewController];
结果:View的样式和storyboard描述的一样
通过xib方式创建View
JHViewController* vc = [[JHViewController alloc] initWithNibName:@"Test"
- 结果:view的样式跟xib描述一致
有同名xib情况
// 但是创建的时候 不用使用 initwithnibname的方法
JHViewController* vc = [[JHViewController alloc] init];- 结果:默认加载的是 files owner的view的连线的view
有同名去掉controller的情况
JHViewController* vc = [[JHViewController alloc] init];- 结论:优先级会比同名xib高
loadview
• 卸载控制器中,用来重写控制器的view,优先级最高
重写控制器的loadView,不会去加载storyboard.
• loadView方法
* loadView作用:一般用来创建自定义的view
* loadView什么时候调用:当控制器的view没有创建的时候,就会调用loadView 去创建控制器的view.
* loadView的默认做法:会去加载UIStoryboard描述的控制器的view* 如果重写了loadView方法, § 并且没有调用默认的操作,就不会加载UIStoryboard描述的控制器。 § 就不会自动创建控制器的view,必须自己自定义控制器的view。就不会自动创建控制器的view,必须自己自定义控制器的view。 § 并且没有创建控制器的view,就不能获取控制器的view,否则会造成死循环。 * 如果控制器是窗口的根控制器,可以不用设置尺寸,系统默认会设置尺寸。 * loadView使用注意:如果重写loadView里面没有创建控制器的view,就不能使 用self.view,会造成死循环。
• 控制器View的决定权:重写LoadView>storyboard>nibName>xib
- 控制器的view是延迟加载的。
- 只有在窗口显示的时候,才会调用loadView 方法。
- 用到控制器view的时候才会加载控制器的view,设置控制器view的背景颜色
- 通过设置控制器view的颜色,引出两个疑问。
a. 控制器的view由loadView决定, loadView显示什么颜色,就是什么颜色。
b. loadView只是创建控制器View,并不能决定控制器的view的颜色。
c. 理解loadView的调用时刻:第一次调用self.view,底层会调用LoadView 方法,创建控制器的view,这时候的view是LoadView的颜色,但是 vc.view.backgroundColor,是拿到控制器的view又设置一次颜色,把 LoadView设置的颜色给覆盖了。
d. 在viewDidLoad也设置颜色,还是vc.view.backgroundColor决定,因为vc.view就是获取控制器的view,只有控制器的view加载完成之后,才能获取 到,因此先调用viewDidLoad。
- 如何快速生成一个xib描述控制器的view,之前还要在xib拖视图,设置xib描述哪个控制器,很麻烦。
- 定义新的控制器的时候,勾选xib,会自动搞一个xib描述控制器的view.
会自动生成一个和控制器同名的xib,并且里面设置好了。
- 定义新的控制器的时候,勾选xib,会自动搞一个xib描述控制器的view.
ViewController的加载方式
1、通过代码的方式加载viewController
UIViewController *controller = [[UIViewController alloc] init];
controller.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = controller;
2、通过stroyboard来加载viewController
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加载箭头指向的viewController
JHViewController *controller = [storyboard instantiateInitialViewController];
self.window.rootViewController = controller;
3、通过xib加载viewController
CZViewController *controller = [[CZViewController alloc] initWithNibName:@"CZOneView" bundle:nil];
self.window.rootViewController = controller;
4.流程图
• loadView什么时候会调用->当 self.view == nil 的时候会调用,要创建 self.view
• 优先顺序
1> 用系统的loadView方法创建控制器的视图
2> 如果指定加载某个storyboard文件做控制器的视图,就会加载storyboard里面的描述去创建view
3> 如果指定读取某个xib文件做控制器的视图,就根据指 定的xib文件去加载创建
4> 如果有xib文件名和控制器的类名前缀(也就是去掉controller)的名字一样的 xib文件 就会用这个xib文件来创建控件器的视图 例:控件器的名为 MJViewController xib文件名为 MJView.xib 如果xib文件名后有一个字不一样就不会去根据它去创建如:MJView8.xib
5> 找和控制器同名的xib文件去创建
6> 如果以上都没有就创建一个空的控件器的视图;