UIViewController作为MVC架构中Controller可以说是重中之重,负责加载、布置View,负责管理View的交互,也负责数据的响应。视图控制器也和其他的视图控制器交互。
视图控制器的主要责任由三部分:
1.更新视图的内容,通常是响应数据的修改
2.响应用户和视图的交互
3.调整视图的尺寸并管理界面的布局
视图控制器加载视图的方式主要有三种:
1.从Storyboard
中加载
2.从Nib
文件中加载
3.在loadView
方法使用代码加载
视图控制器需要注意可视性(visibility),比如视图的额外初始化、切换到其他视图控制器时保存状态。下面是视图控制器可视性的相关方法:
-(void)loadView
//加载视图
-(void)viewDidLoad
//视图加载完成之后
-(void)viewWillAppear:(BOOL)animated
//视图加载完成之后即将出现
-(void)viewDidAppear:(BOOL)animated
//视图出现之后
-(void)viewWillDisAppear:(BOOL)animated
//视图将要隐藏
-(void)viewDidDisAppear:(BOOL)animated
//视图隐藏之后
一般使用viewWillAppear
方法在视图出现前修改视图的显示,viewWillDisappear
方法保存视图的信息。
viewWillLayoutSubViews
和viewDidLayoutSubviews
方法是用来处理视图布局的,虽然默认情况下都是什么都不做的。在iOS 8之后,视图的旋转被视为大小的变化,使用viewWillTransitionToSize:withTransitionCoordinator
方法管理。如果想判断是否横屏,可以采用下面的代码:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator: (id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
BOOL isLandscape=size.width>size.height?YES:NO;
//针对横屏的一些操作
}
视图控制器是作为容器(container)包含其他View Controller的,负责管理子视图控制器的显示,常见的有UITabBarController
、UINavigationController
。
View Controller还有一类特殊的关系叫做弹出/呈现(present),如果一个标签视图控制器弹出了一个导航视图控制器,而这个导航视图控制器又弹出了一个视图控制器,这样标签视图的presentedViewController
就是导航视图控制器,导航视图控制器的presentedViewController
就是子视图控制器,如果definesPresentationContext
是默认值NO
的话,子视图控制器和导航控制器的presentingViewController
都是标签控制器,否则,子视图控制器的presentingViewController
是导航控制器。
网友评论