一、视图控制器
二、视图控制器指定⾃自定义 View
三、屏幕旋转
四、处理内存警告
MVC概述
UIViewController 是 MVC 设计模式的核⼼心。
MVC 是⼀一个框架级的设计模式。
M 是 Model ,主要⽤用于建⽴立数据模型(即数据的结构)
V 是 View ,我们能看到的所有控件都是 view , view 主要的功能是展⽰示数据。
C 是控制器,主要是控制 M 和 V 的通信。
ViewController 1. 控制视图显示(根视图 view ) 2. 处理响应事件( UIbutton 的)
3. 监测设备旋转方向 4. 接收系统发出的内存警告
执行顺序 1. 创建 controller 对象 (系统指定初始化方法) 2. 创建 controller 的 view (可以设置自定义 view ) 3. 加载 controller 的 view (布局子视图)
1.创建 controller 对象 (系统指定初始化方法)
//controller 的指定初始化方法。 - ( id )initWithNibName:( NSString *)nibNameOrNil bundle:( NSBundle *)nibBundleOrNil { self = [ super initWithNibName :nibNameOrNil bundle :nibBundleOrNil]; if ( self ) { // Custom initialization NSLog ( @"%s,%d" , __FUNCTION__ ,__LINE__); // 不要再 controller 的初始化中操作根视图 view // 即 不要使用 self.view (还没有根视图) } return self ; }
// 创建 viewController 对象时, viewContriller 会默认创建一个 UIView 对象。 // 该方法执行时, viewContronller 控制的 view 已经创建并加载到 window // 当根视图 view 将要显示在 window 上时,才会执行 ( 减少内存 ) // 视图已经加载, - ( void )viewDidLoad;
// 在 window 上显示登陆页面 // 不直接在 window 上添加子视图 // 先创建一个管理页面的 UIViewController , UIViewController 设置给 window 作为根视图控制器 // 先创建视图控制器 LoginViewController * loginVC = [[ LoginViewController alloc ] init ]; // 设置 window self . window . rootViewController = loginVC; // [self.window addSubview:loginVC.view]; 方法相同 [loginVC release ];
2. 创建 controller 的 view (可以设置自定义 view )
// 重写继承得到的 loadView 方法 // 创建并指定 controller 的根视图 view // 如果不重写,即 contronller 默认创建一个 UIView 类型的根视图对象 // 如果重写,即我们需要在 controller 当中,自己创建并指定一个根视图对象,可以是自定义视图类型,例如: LoginView - ( void )loadView { self . view = [[[ UIView alloc ] initWithFrame :[[ UIScreen mainScreen ] bounds ]] autorelease ]; NSLog ( @"%s,%d" , __FUNCTION__ ,__LINE__); }
3. 加载 controller 的 view (布局子视图)
使用视图控制器
定义 UIViewController 的⼦子类
创建视图控制器对象,作为 window 的根视图控制器
在 viewDidLoad 中使⽤用默认创建好的视图对象 view
如何设置
⾃自定义视图类继承 UIView 。在初始化⽅方法中添加⼦子视图控件。
重写 controller 的 loadView ⽅方法。创建⾃自定义视图对象,并指定为 controller 的 view 。
将⼦子视图控件对象设置为⾃自定义视图类的属性,在 viewDidLoad ⽅方法中进 ⾏行设置:添加 action 、设置 delegate 等等。
在 controller 中添加按钮点击事件实现和代理⽅方法的实现。
视图控制器本⾝身能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写⼏几个
⽅方法:
1. supportedInterfaceOrientations (设置设备⽀支持旋转的⽅方向)
2. willRotateToInterfaceOrientation:duration: (暂停⾳音乐、关闭视图交互等)
3. willAnimateRotationToInterfaceOrientation:duration: (添加⾃自定义动画 等)
4. didRotateFromInterfaceOrientation :(播放⾳音乐、打开视图交互等)。
宏定义
#define UIInterfaceOrientationIsPortrait(orientation) ((orientation) == UIInterfaceOrientationPortrait || (orientation) == UIInterfaceOrientationPortraitUpsideDown) #define UIInterfaceOrientationIsLandscape(orientation) ((orientation) == UIInterfaceOrientationLandscapeLeft || (orientation) == UIInterfaceOrientationLandscapeRight)
视图处理
注意视图控制器会⾃自动调整 view 的⼤大⼩小以适应屏幕旋转, bounds
被修改,触发 view 的 layoutSubviews ⽅方法。
view 重写 layoutSubviews ⽅方法,根据设备⽅方向,重新布局。
[UIApplication shareApplication].statusBarOrientation 提供设备 当前⽅方向。
处理内存警告
控制器能监测内存警告,以便我们避免内存不够引起的 crash 。
在定义的 controller ⼦子类中重写 didReceiveMemoryWarning ⽅方法。
释放暂时不使⽤用的资源。 ( 数据对象、图像 )
// 内存警告 - ( void )didReceiveMemoryWarning { [ super didReceiveMemoryWarning ]; // Dispose of any resources that can be recreated. NSLog ( @"%s,%d" , __FUNCTION__ ,__LINE__); // self.view = nil;// 直接释放内存会释放掉用户正在使用的视图 if ([ self isViewLoaded ] == YES && self . view . window == nil ) { //controller 创建并加载过的根视图,并且 controller 的根视图没有在 window 显示, // 销毁不需要使用的数据对象和视图 self . view = nil ; } }