视图控制器UIViewController
每一个UIViewController都自带一个视图,并且负责这个视图的一切事物,包括模型层(Model)与显示层(View)之间的通信,检测设备的旋转,监控内存警报。
UIViewController是一个抽象类所有视图控制器的基类,如果要是用视图控制器就要创建一个它的子类。
当我们创建一个视图控制器的时候在它的.m文件中默认为我们添加了类的延展用以管理该类的私有属性和方法。
给window创建一个根视图控制器的步骤:
// 1.导入头文件MainViewController.h
// 2.在AppDelegate.m中创建一个UIViewController对象
MainViewController *mainVC = [MainViewController alloc] init];
// 3.将mainVC对象设置为window的根视图控制器
[self.window setRootViewController:mainVC];
// 4.释放mainVC对象
[mainVC release];
UIViewController和UIApplicationDelegate一样具有生命周期,并且有一系列类似的方法:
initWithNibName:bundle: // 指定初始化方法 数据的处理 写在这个方法里 MRC下 有数据处理的时候要记得在后面dealloc
viewDidLoad //视图加载之后被调用 只调用一次 一般的视图操作(添加视图,改变视图设置)都写在这里
didReceiveMemoryWarning // 接受到内存警告的时候调用
以上三个方法是在UIViewController子类创建的时候Xcode自动生成的
--------我是分隔线1--------
viewWillAppear // 视图将要出现的时候调用
viewDidAppear // 视图出现的时候调用
viewWillDisappear // 视图将要消失的时候调用
viewDidDisappear // 视图消失的时候调用
-------我是分割线2--------
另外 loadView // 同样,这个方法也只调用一次
loadView在API中的注释:
- (void)loadView; // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.
对比viewDidLoad的注释:
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set.
不太理解loadView与viewDidLoad的区别,扩展阅读请戳这里:扩展阅读
-------我是分割线3--------
UIViewController本身可以检测屏幕旋转,如果需要处理屏幕旋转的事件同样需要重写几个方法
supportedInterfaceOrientations、willRotateToInterfaceOrientation:duration:(暂停音乐、关闭视图交互等)
willAnimateRotationToInterfaceOrientation:duration:(添加自定义动画等) didRotateFromInterfaceOrientation:(播放音乐、打开视图交互等)。
注意视图控制器会自动调整view的大小以适应屏幕旋转,触发view的layoutSubviews方法
除了控制屏幕旋转,还能检测内存警告,以便避免内存不够引起的crash
-------我是分割线4--------
在一个button的回调函数里定义另外一个UIViewController,创建对象后需要弹出新的View
弹出的方法 presentViewController:animated:completion:
// 参数1:需要弹出的UIViewController
// 参数2:是否需要动画效果
// 参数3:弹出执行完毕后,执行block里面的代码
注:UIViewController是整个iOS的核心