主要工作:
- 更新view,修改view数据
- 响应用户交互
- UIViewController也是UIResponder对象,在responder chain中的位置处于UIViewController的根视图和其父视图之间
- 如果view controller内的视图都不处理事件,那么view controller将会处理事件、或者将事件传递给视图的父视图
- 管理view布局,调整view大小
为view controller指定view
- 通过storyboard加载view,同时能指定view controller和view之间的关联,还能指定viewcontrollers之间的关联
- 使用
instantiateViewControllerWithIdentifier:
获取UIStoryBoard对象
- 使用
- 通过nib file创建views
- 使用initWithNibName:bundle:来进行viewcontroller初始化
- 使用
loadview
- 在loadview方法中手动代码创建view和视图之间的关系
view controller的根视图(root view)总是会适应指定的空间,而其他view则需要使用 Auto Layout
来自适应布局
管理view
- @property(nonatomic, strong) UIView *view
- view controller的root view,默认为空
- 当访问这个属性且这个属性为空时,view controller会自动调用loadview方法,并返回loadview返回的view
- 每个view controller都是root view唯一的拥有者
- 当低内存时view controller会将view赋为nil
- -(void)loadView
- 当属性view为nil时,加载或者创建view并assign给属性view
- 当view controller有一个相关联的nib file文件,这个方法将会从nib file中加载view
- 如果是通过 Interface Builder 方式创建的view,请不要override这个方法
- 如果是希望通过手动代码创建view,可以重载这个方法
- 有更多view相关的初始化操作 ,可以在viewdidload中进行
- 不要在这个方法里调用 [supper loadView] 或者 self.view
- -(void)viewDidLoad
- 当controller's view 后会被调用
- 通过nib file加载view 还是通过loadview中手动创建view 都会调用viewdidload
展示view controller
- -(void)showViewController:(UIViewController *)vc sender:(id)sender
- 目的就是简化编程,省去判断一些条件。比如,会自动为nav controller有关的vc调用push,而为普通的view controller调用present函数。
- -(void)showDetailViewController:(UIViewController *)vc sender:(id)sender
- 为了UISplitViewController 而写的高级版showViewController
- -(void)presentViewController:(UIViewController*)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
- 传统的模态跳转方法
- -(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
- 与presentViewController搭配使用
配置view布局行为
- -(void)viewWillLayoutSubviews
- 通知view controller它的view将要布局subviews
- -(void)viewDidLayoutSubviews
- 通知view controller的view subviews已经完成布局
- addSubview会触发layoutSubviews
- 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
- 滚动一个UIScrollView会触发layoutSubviews
- 旋转Screen会触发父UIView上的layoutSubviews事件
- 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
- 通知view controller的view subviews已经完成布局
- -(void)updateViewConstraints
- 当view controller的view需要更新约束的时候