iOS 【UIKit-方法- (void)loadView; 的详解】
来源:互联网 发布:论文查重软件免费 编辑:程序博客网 时间:2024/05/19 18:11
一、- (void)loadView; 方法的作用
控制器会调用该方法去创建控制器的View
二、默认做法
① 先去判断当前控制器是不是从StoryBoard当中加载的,如果是,那么它就会从StoryBoard当中加载控制器的View。
② 如果不是从StoryBoard当中加载的, 那么它还会判断是不是从Xib当中创建的控制器。如果是,那么它就会从xib加载控制器的View。
③ 如果也不是从Xib加载的控制器。那么它就会创建一个空的UIView,设为当前控制器的View。
三、什么时候调用
第一次使用控制器的View,在view的get方法中调用。
四、注意事项
① 一旦重写了loadView,表示需要自己创建控制器的View。
② 如果控制器的View还没有赋值,就不能调用控制器View的get方法,会造成死循环。因为控制器View的get方法底层会调用loadView方法。
五、关于各方法调用顺序分析
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
XMGViewController *loginVc = [[XMGViewController alloc] init];
// 在此处代码,会调用view的get方法(内部会调用loadView方法)
// 注意,调用loadView是view的get方法内部的事情,所以说是在下面这句设置bgColor的代码执行中调用的。也可以这么理解,这句代码是一系列调用的开始,也是结束。
loginVc.view.backgroundColor = [UIColor blueColor]; // 蓝色
self.window.rootViewController = loginVc;
[self.window makeKeyAndVisible];
return YES;
}
控制器的view是懒加载的,懒加载在view的get方法中去执行。在view的get方法中会调用loadView方法和viewDidLoad方法。
- (UIView *)view {
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view;
}
- (void)loadView {
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor]; // 红色
// view.frame = self.view.bounds; 这句话是错误的,因为后面的self.view是调用了view的get方法,死循环。
self.view = view;
view.frame = self.view.bounds; // 因为self.view已经赋值了。所以这句话放在这里就不会出错
}
注意点:在给loadView方法当中,如果没有给self.view进行赋值,就不要使用self.view。但是一旦赋值了就可以使用了。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor]; // 黄色
}
此处代码显示蓝色。因为蓝色是最后设置上的,覆盖了之前设置的红色和黄色。
控制器会调用该方法去创建控制器的View
二、默认做法
① 先去判断当前控制器是不是从StoryBoard当中加载的,如果是,那么它就会从StoryBoard当中加载控制器的View。
② 如果不是从StoryBoard当中加载的, 那么它还会判断是不是从Xib当中创建的控制器。如果是,那么它就会从xib加载控制器的View。
③ 如果也不是从Xib加载的控制器。那么它就会创建一个空的UIView,设为当前控制器的View。
三、什么时候调用
第一次使用控制器的View,在view的get方法中调用。
四、注意事项
① 一旦重写了loadView,表示需要自己创建控制器的View。
② 如果控制器的View还没有赋值,就不能调用控制器View的get方法,会造成死循环。因为控制器View的get方法底层会调用loadView方法。
五、关于各方法调用顺序分析
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
XMGViewController *loginVc = [[XMGViewController alloc] init];
// 在此处代码,会调用view的get方法(内部会调用loadView方法)
// 注意,调用loadView是view的get方法内部的事情,所以说是在下面这句设置bgColor的代码执行中调用的。也可以这么理解,这句代码是一系列调用的开始,也是结束。
loginVc.view.backgroundColor = [UIColor blueColor]; // 蓝色
self.window.rootViewController = loginVc;
[self.window makeKeyAndVisible];
return YES;
}
控制器的view是懒加载的,懒加载在view的get方法中去执行。在view的get方法中会调用loadView方法和viewDidLoad方法。
- (UIView *)view {
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view;
}
- (void)loadView {
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor]; // 红色
// view.frame = self.view.bounds; 这句话是错误的,因为后面的self.view是调用了view的get方法,死循环。
self.view = view;
view.frame = self.view.bounds; // 因为self.view已经赋值了。所以这句话放在这里就不会出错
}
注意点:在给loadView方法当中,如果没有给self.view进行赋值,就不要使用self.view。但是一旦赋值了就可以使用了。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor]; // 黄色
}
此处代码显示蓝色。因为蓝色是最后设置上的,覆盖了之前设置的红色和黄色。
1 0
- iOS 【UIKit-方法- (void)loadView; 的详解】
- - (void)loadView方法
- iOS开发 -- loadView方法
- iOS UIKit框架详解
- IOS -- ViewController的LoadView和ViewDidLoad方法相关知识总结
- IOS -- ViewController的LoadView和ViewDidLoad方法相关知识总结
- IOS -- ViewController的LoadView和ViewDidLoad方法相关知识总结
- IOS -- ViewController的LoadView和ViewDidLoad方法相关知识总结
- IOS viewDidLoad方法被执行两次(viewDidLoad和loadView方法详解)
- IOS viewDidLoad方法被执行两次(viewDidLoad和loadView方法详解)
- ios 之控制器的loadview
- [ios]loadView、viewDidLoad、viewWillAppear、viewDidAppear等详解
- iOS中UIKit的外观属性及方法汇总
- void 和void*的详解
- iOS loadView
- loadView详解
- ios UIKit的图形上下文
- IOS学习笔记10-UIView的一些基本方法理解:loadView、viewDidLoad、viewDidUnload、viewWillAppear、viewWillDisappear、
- Leetcode Unique Word Abbreviation
- iOS 【Runtime 初理解】
- Ruby中的各种方法定义和调用(函数式方法|实例方法|类方法)
- Leetcode Summary Ranges
- Leetcode Perfect Squares
- iOS 【UIKit-方法- (void)loadView; 的详解】
- JAVA中的static关键字
- 如何从官网下载 Google Chrome 离线安装包
- Navicat 导入sql脚本文件
- sublime用nodejs直接运行js
- windows快捷方式
- centos ping不通内网 网关 外网 域名等以解决 通过设置为动态IP(启用dhcp协议)
- redis入门
- ruby中的打印函数print | puts | p