3.UIViewController详解
一. UIViewController,视图控制器,它是UIKit中非常重要的组成部分。它由控制器+View两部分组成。
控制器功能:
-》实现代码逻辑,决定它自带的View的界面显示。
-》控制器与控制器之间的通信,如传值,跳转。
-》以及与Model和View间的信息传递。
-》可以通过addChirldViewController来添加子控制器。(如抽屉效果,多选tableView都是采用此方式)
视图功能:
-》向用户展示信息
-》可以添加子视图,设置子视图的层别
-》可以接收响应事件(用户在触摸后屏幕后就会形成一个基于触摸点的UIEvent事件)
这个事件通过 application - > keyWindow- > UIViewController(可选择,如果没有则直接传递给下一级)-》View-》subView -》.....->知道最终找到触摸点所在的那个位置对应的视图->查找该处视图是否有添加响应时间-》没有则自动释放-》有则通过该触摸点View->父视图-》控制器(没有直接向上一级出传递)-》keyWindow-》applcation。
二. UIViewController的生命周期
经过测试执行顺序由上到下:
1. 首先给视图控制器分配空间,然后初试化,接着创建唯一的UIView视图。
2016-03-10 22:24:47.029 Demo_10_抽屉效果[74967:4603110] +[MainViewController alloc],分配空间
2. init方法初始化,将这块内存的数据清空;系统也提供了init的改写方法,在初试化的时候直接连View一起加载好,
视图控制器初试化好之后就是加载VIew,加载View有三种方式.
-> 通过initWithCoder:从故事版中加载
-> 通过initWithNibName:从xib中加载
-> 通过自己使用代码进行创建。
在没有故事版和storyBoard调用次方法视图可以从Xib StroyBoard 代码中创建
2016-03-10 22:24:47.029 Demo_10_抽屉效果[74967:4603110] -[MainViewController initWithCoder:],从故事板归档文件中加载视图出来了
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 从xib二进制文件中加载出来了
将解压或者代码创建视图加载出来
3. loadView,将从storyBoard或者Nib文件,或者代码创建的View加载到系统中
2016-03-10 22:24:47.061 Demo_10_抽屉效果[74967:4603110] -[MainViewController loadView],加载控制器的唯一视图View视图已经加载出来了
4. View已经加载出来了,如果改视图控制器不销毁,只是界面切换,那么此方法只会执行一次。
2016-03-10 22:24:47.062 Demo_10_抽屉效果[74967:4603110] -[MainViewController viewDidLoad],视图已经加载出来了 视图将要显示在手机屏幕上
5. View将要显示到屏幕上,通常我们需要进行一些预先加载的操作可以写到这里,比如添加通知事件。
2016-03-10 22:24:47.063 Demo_10_抽屉效果[74967:4603110] -[MainViewController viewWillAppear:],视图将要显示在屏幕界面上了
6. 因为ViewFrame已经计算好了,且将要显示到屏幕上,但是它的子视图还没有固定好,所有先要调用子视图的两个方法
视图开始布局子视图了,当子视图的约束写在此方法中时,当视图变化时候,子视图会跟着变化。
2016-03-10 22:24:47.069 Demo_10_抽屉效果[74967:4603110] -[MainViewController viewWillLayoutSubviews],视图开始布局自视图了
. 2016-03-10 22:24:47.069 Demo_10_抽屉效果[74967:4603110] -[MainViewController viewDidLayoutSubviews],视图的子视图已经布局完了
7. subView布局好之后,View才开始真正的显示视图
[MainViewController viewDidAppear:],视图已经出现在屏幕上了
8. View将要消失
-(void)viewWillDisappear:(BOOL)animated
9. View已经消失在界面上了。通常我们一些通知事件移除可以写在此方法中。
- (void)viewDidDisappear:(BOOL)animated
10.控制器收到了内存不足警告
- (void)didReceiveMemoryWarning
11.下面两个是死亡方法
- (void)viewDidUnLoad 视图警告内存不足可能被卸掉,下次就会继续执行viewDidLoad
- (void)dealloc 当前视图控制器销毁
三 . UIViewController中布局子视图的时机。
通常我们所说的布局子视图其实就是调用layOutSubViews.应为只有这个方法才会对父视图上的所有子视图进行统一的计算,然后再进行调用。
下面请看这几个方法:
1. layOutSubViews: 这个方法默认是什么都不做的,我们需要布局的子视图对象的frame计算方式都可以写在这里。
2. setNeedsLayout方法:将调用者标记为需要进行重新布局,采取异步调用layoutIfNeed刷行布局(异步及另外开辟线程,不会立即刷新)。同时会调用layOutSubViews的方式刷新子视图布局。
3.layoutIfNeeded方法:如果该对象有需要刷新的标记,则会立即自动调用layoutSubViews。(如果没有这个标记的话,则不会马上调用layOutSubViews);视图在第一次看时的时候都会有需要刷新的标记,所以可以调用 [xxx.view layOutIfNeeded]
4. 子视图重绘改变布局:
-drawRect:(CGRect)rect方法:重写此方法执行重绘任务。
-setNeedsDisplay方法,标记为需要绘,异步执行上面的方法进行绘制。例如当我们在做画笔工具的时候需要对路径进行实时勾勒,可以调用此方法。
-setNessdsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘。
#pragma mark NSObject 线程安全与运行环境加载
+ (void)load {
NSLog(@"%s",__func__);
} + (void)initialize {
NSLog(@"%s",__func__);
} + (instancetype)alloc {
NSLog(@"%s,分配空间",__func__);
return [super alloc];
} //+ (instancetype)allocWithZone:(struct _NSZone *)zone {
// NSLog(@"%s,分配空间",__func__);
// return [self allocWithZone:zone];
//} - (instancetype)init {
NSLog(@"%s,初始化空间",__func__);
return [self init];
} //- (instancetype)initWithCoder:(NSCoder *)aDecoder {
// NSLog(@"%s,从归档文件总加载",__func__);
// return [super initWithCoder: aDecoder];
//} - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
NSLog(@"%s,从Nib二进制文件中加载",__func__);
return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
} - (void)loadView {
NSLog(@"%s,加载控制器的唯一视图View",__func__);
[super loadView];
} - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
NSLog(@"%s,视图的size发生改变",__func__);
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
} - (void)viewDidLoad {
NSLog(@"%s,视图已经加载出来了",__func__);
[super viewDidLoad];
} - (void)viewWillAppear:(BOOL)animated {
NSLog(@"%s,视图将要显示在屏幕界面上了",__func__);
[super viewWillAppear:animated];
} //- (void)viewWillLayoutSubviews {
// NSLog(@"%s,视图开始布局自视图了",__func__);
// [super viewWillLayoutSubviews];
// UIButton* button = [[UIButton alloc]initWithFrame:CGRectMake(20, 20, 100, 30)];
// [button setTitle:@"test btn" forState:UIControlStateNormal];
// [button setTintColor:[UIColor greenColor]];
// [self.view addSubview:button];
//}
//
//- (void)viewDidLayoutSubviews {
// NSLog(@"%s,视图的子视图已经布局完了",__func__);
// [super viewDidLayoutSubviews];
//} - (void)viewDidAppear:(BOOL)animated {
NSLog(@"%s,视图已经出现在屏幕上了",__func__);
[super viewDidAppear:animated];
} - (void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s,视图将要消失了",__func__);
[super viewWillDisappear:animated];
} - (void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s,视图已经消失了",__func__);
[super viewDidDisappear:animated];
} #pragma mark 可选择性的
- (void)loadViewIfNeeded {
[super loadViewIfNeeded];
}
3.UIViewController详解的更多相关文章
- UIViewController中各方法调用顺序及功能详解
UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- UI第六节——UINavigationController 详解
1. UINavigationController 是一个容器类.里面盛放的是UIViewController. 容器的意思是,如果你不放入UIViewController,里面就是空的,什么也没有. ...
- 详解CALayer 和 UIView的区别和联系
详解CALayer 和 UIView的区别和联系 前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 CALayer 的区别和联系的时候,被喵神指出没有切中要点,所以这里就 CALay ...
- [转]iOS学习之UINavigationController详解与使用(三)ToolBar
转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...
- iOS 视图控制器转场详解
iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...
- iOS开发——控制器OC篇&UINavigationController&UITabBarController详解
UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationControl ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- UINavigationController使用详解
UINavigationController使用详解 有一阵子没有写随笔,感觉有点儿手生.一个多月以后终于又一次坐下来静下心写随笔,记录自己的学习笔记,也希望能够帮到大家. 废话少说回到正题,UINa ...
随机推荐
- Quartz2D 编程指南(二)变换、图案、阴影
概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 5.变换 简介 Quartz 2D ...
- ISO8583报文协议
最开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等.在各个计算机设备之间,需要交换数据.我们知道数据是通过网络来传送的,而在网络上传送的数据都是基于0或1这样的二进制数据,如果没有 ...
- cordova使用Gradle构建下载maven太慢,使用阿里云镜像
修改build.gradle: buildscript { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/group ...
- css加载优化
<head> <script> // https://github.com/filamentgroup/loadCSS !function(e){"use stric ...
- UE4入门与精通
由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...
- 总结运行SSIS包的几种方式
方式一: 在BIDS里直接跑. 这个BIDS指的就是SQL Server Business Intelligence Development Studio,对于.net开发者来说它就是Visual S ...
- MFC工程资源相对路径
Project->Properties->Configuration Properties->Debuging->Working Directory改为$(ProjectDir ...
- Slackware Linux or FreeBSD 配置中文环境。
配置中文环境. Slackware Linux 如果在控制面板的语言与地区选项中没有找到中文,那说明在安装系统选择软件的时候没有将国际语言支持包选上,可以从slackware的安装盘或ISO文件中提取 ...
- js基础练习三之数码时钟
这章节有两个实例,1,定时器的使用; 2,数码时钟; 用到的js知识:定时器,Date对象. >>>>>定时器 开启定时器: setInterval 间隔型 setTim ...
- workbench中safe update
1.在workbench中表格显示为readonly ,更新时提示Error Code: 1175. You are using safe update mode and you tried to u ...