UIViewController为所有的iOS apps提供了视图管理的基础。View Controller与其管理的视图进行了严格的绑定,并且参与到处理事件的响应链中。一个App至少包含一个View Controller,通常我们会自定义一个UIViewController的子类,包含App相关的视图显示以及与用户交互的处理方法。
View Controller的使用场景:
1. 调整或显示视图;
2. 调整视图的内容;
3. 用户与视图进行交互
常用属性
- view:viewController管理的视图。该视图是viewController视图层次中最底层的根视图。若访问该属性,且属性的当前值为nil时,view controller会自动调用loadView方法并返回一个结果视图。
- editing:是否允许用户编辑视图内容。当editing为YES时,通过viewController获得的editButtonItem会自动变为从edit变为done。这个通常在navigationController中使用。
- interfaceOrientation:一个只读变量,显示当前界面的方向,只有当该View Controller占据全屏时才有效。主要属性如下:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
- nibBundle:指向当前controller的nib bundle(NSBundle对象表示文件系统中能够在程序中使用的代码和资源的位置。NSBoundle对象定位程序资源,动态加载和卸载可执行代码,辅助本地化。)
- nibName:指向当前controller的nib文件。若希望使用nib文件来初始化视图,建议明确指定nib文件的名称。如果没有指定nib文件,同时也没有重写loadView方法,则view controller会通过其他方式来搜索nib文件。例如:
- 若controller的类名为MyViewController,则他会自动搜索没有Controller后缀的文件:MyView.nib作为当前View Controller的nib文件
- 若controller的类名为MyViewController,其会搜索:MyViewController.nib作为当前View Controller的nib文件。
- tabBarController:指向当前view controller嵌入的UITabBarController对象。
- navigationController:指向当前view controller嵌入的UINavigationController对象。
- splitViewController:指向当前view controller嵌入的UISplitViewControler对象。
- title:表示当前viewController管理的视图。
- tabBarItem:当ViewController添加到一个tab bar controller中时,该属性表示当前viewController。该属性是UITabBarItem创建的唯一实例,当viewController是tab bar controller的子对象时,用来表示当前的view Controller。
- toolbarItems:该属性是一个包含UIBarButtonItem对象的数组,与UINavigationController对象协同工作。如果当前的viewController嵌入到一个navigationController界面中,并且navigationController显示了一个toolbar,则该属性指向了toolbar中显示的item。
常用方法
-
- (void)viewDidLoad:该函数将在controller的视图载入到内存之后调用。该函数无论视图是从nib文件中载入还是从编程创建(loadView)方法中载入都会调用,是非常重要的方法。
-
- (void)loadView:创建由controller管理的视图。该函数不能直接调用,该函数当controller的view属性需要使用,但是当前为空时进行调用。即,该方法创建了一个视图,并将创建的结果赋值到controller的view属性。如果view controller关联了一个nib文件,则此时视图将从nib文件中载入。其中,通过设置View Controller的nibName属性来关联一个View Controller和一个nib文件。或者直接通过initWithNibName:bundle来初始化一个Controller。
-
(void)viewDidAppear:(BOOL)animated:通知View Controller其视图已经添加到了视图层次结构中。可以通过重写该方法,在presenting(切换)视图时增加额外的处理方法,在该方法中,必须调用super中的方法传递操作。BUT,当该View Controller(Controller A)通过popover方法切换到另一个View Controller(Controller B)时(此时Controller A在controller B的popover队列中),若controller B调用dismissed方法后,viewDidAppear方法不会被触发。
-
(void)viewWillAppear:(BOOL)animated:通知View Controller它的View即将添加到视图层次结构中。该方法在接收者(View Controller)的视图即将添加到视图层次结构中,以及所有在view中显示的动画配置之前调用。通过重写该方法,可以自定义视图显示相关的操作。例如,可以在该方法内改变状态栏的方向和样式,使其与视图的方向和样式保持一致。
-
- (void)viewDidDisappear:(BOOL)animated:通知View Controller其视图已经从视图层次结构中移除。该方法能够在视图dismissing或者hidding时增加额外的操作。与viewDidAppear类似,必须调用super进行相关操作。
-
- (void)viewWillDisappear:(BOOL)animated:通知View Controller它的View即将从视图层次中移除。该方法在视图从层次结构中移除时调用。该方法在视图实际移除之前以及所有的动画配置之前调用。通过重写该方法,可以提交编辑改变、放弃视图的first responder状态以及其他相关任务等。例如,可以在该方法中还原viewWillAppear中的状态栏样式和方向的操作。
-
- (void)viewDidLayoutSubviews:当View Controller的视图展示他的子视图时调用。当View Controller视图的bounds发生改变时,view会自动调整它子视图的位置,此时系统会调用该方法。但是,该方法并不关心子视图中私有布局的调整,每一个子视图对自己的layout负责。
-
- (void)viewWillLayoutSubviews:当View Controller的视图即将展示子视图时调用。当视图的bounds发生改变,view调整其子视图的位置时,可以通过重写该方法添加当前视图展示子视图前的操作。
时间序列
视图显示序列
视图消失序列
生命周期