iOS开发--UIWindow与程序启动原理与两种创建控制器的方法

View的生命周期

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第1张图片
Paste_Image.png

main函数
程序的入口main函数

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第2张图片
Paste_Image.png
/* UIApplicationMain底层实现
1.根据principalClassName提供类名创建UIApplication对象
2.创建UIApplicationDelegate对象,并且成为UIApplication对象代理,app.delete = delegate
3.开启一个主运行循环,处理事件,可以保持程序一直运行。
4.加载info.plist,并且判断有木有指定main.storyboard,如果指定,就会去加载
*/
iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第3张图片
Paste_Image.png

UIWindow

UIWindow是一种特殊的View
1.iOS启动完毕后,创建的第一个视图控件就是UIWindow。
2.接着创建控制器的View,
3.然后将控制器的view添加到UIWindow上
4.于是控制器的View就显示在屏幕上了。
5.也就是说没有UIWindow,就没有UI界面

程序启动原理:

执行main
执行UIAPPLICATIONMain
1.创建UIApplication
2.创建UIApplicationDelegate,并且成为UIApplication的代理
3.开启一个主运行循环
4.加载info.plist,判断有没有指定main.storyboard,指定了就加载

加载main.storyboard

1.创建窗口
2.加载main.storyboard,并且加载main.storyboard指定的控制器
3.把新创建的控制器,作为窗口的根控制器,让窗口显示出来

1、手动创建窗口步骤

1.自己加载程序启动-删掉main
iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第4张图片
Paste_Image.png
2. 在 AppDelegate
iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第5张图片
Paste_Image.png

举例:如果需要看到键盘,必须把键盘添加到一个View上面去

首先了解什么是窗口:键盘、状态栏是窗口
窗口层级关系:
// 窗口是有层级关系
// UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第6张图片
Paste_Image.png

2、控制器的创建(storyboard)

1.不通过系统创建:

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第7张图片
Paste_Image.png
  1. // instantiateInitialViewController:加载箭头指向的控制器
iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第8张图片
Paste_Image.png

3.根据标识来加载:

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第9张图片
Paste_Image.png
Paste_Image.png

3、控制器的创建(Xid)

/* 通过xib创建控制器的view
 1.一定要描述xib的文件拥有者是控制器,也就是说这个xib是用来描述控制器
 */

1.通过File`s Owner 更改它的描述类型是控制器

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第10张图片
Paste_Image.png

2.修改Xib描述为控制器的类型后,就可以连线了。

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第11张图片
Paste_Image.png

3.通过Xib 要是用控制器alloc】 initWithNibName:bundle:】 bundle传nil默认就是从[NSBundle mainBundle]

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第12张图片
Paste_Image.png

LoadView

首先自己去创建跟控制器

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第13张图片
Paste_Image.png

在AppDelegate中加载:

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第14张图片
Paste_Image.png

这里创建出来是箭头指向的控制器的View

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第15张图片
Paste_Image.png

但是:通过 loadView方法后
系统就不会去加载storyboard描述的控制器的View

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第16张图片
Paste_Image.png

总结:

loadView作用:自定义控制器的view
loadView什么时候调用:第一次使用控制器的view的时候调用
注意:在这个方法中如果没有自定义view,就不能获取控制器的view
// 一旦重写了这个方法,就不要调用[super loadView]

// 如果重写了这个方法,就不会去加载storyboard描述的控制器的View
// LoadView 默认就可以加载storyboard和Xib描述的控制器的View

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第17张图片
Paste_Image.png

控制器View的创建(XIB)-寻找控制器的XIb

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第18张图片
Paste_Image.png

如果在控制器中实现这个方法:

Paste_Image.png

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

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第19张图片
Paste_Image.png

// 只有控制器的init方法底层会调用initWithNibName:bundle:

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第20张图片
Paste_Image.png

// 只要通过initWithNibName:bundle:初始化控制器,并且nibName为nil,就会执行以下几步。
// 1.寻找有没有跟控制器类名同名但是不带Controller的xib,如果有就会去加载(View.xib)
// 2.寻找有没有跟控制器类名同名的xib,如果有就会去加载(ViewController.xib)
// 3.如果都没有找到,创建空的view,

通过XIB创建控制器View的一览表:

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第21张图片
Paste_Image.png

控制器View的颜色

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第22张图片
Paste_Image.png

设置控制器的View = vc.view.alpha = 0;
那么在Windows上添加的按钮可以点击,
如果设置控制器的View的颜色为透明色,但是系统认为只是几乎透明,不可以点击button

控制器View的懒加载 -(void)ViewDidLoad

控制器的View创建默认就是透明的,看不到也穿不透
我们创建控制器的时候,控制器的View并没有创建

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第23张图片
Paste_Image.png

因为你要使用它,所以这一行就会加载


iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第24张图片
Paste_Image.png

虽然下面设置了控制器的颜色,但是上面的设置颜色阶段就已经显示了控制器

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第25张图片
Paste_Image.png

相当于:我已经加载过ViewDidLoad后,才能设置颜色,所以上面的View的蓝色并不会显示

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第26张图片
Paste_Image.png

即便加载loadView,也不会改变它的颜色,因为最终要调用ViewDidLoad,颜色还是最开始的红色

iOS开发--UIWindow与程序启动原理与两种创建控制器的方法_第27张图片
Paste_Image.png

也就是self.window.rootViewController = ViewController,就不必设置尺寸

开发注意:不要再ViewDidLoad中打印尺寸,在ViewDidAppear中打印尺寸

你可能感兴趣的:(iOS开发--UIWindow与程序启动原理与两种创建控制器的方法)