控制器是用来处理,监听view的事件和状态。
控制器和控制器的view是两码事
一、控制器的多种创建方式
1.通过storyboard创建
// 加载storyboard
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Two" bundle:nil];
// 创建storyboard里面箭头所指的控制器(初始化“初始控制器”(箭头所指的控制器))
// UIViewController *vc = [storyboard instantiateInitialViewController];
//创建storyboard里面storyboard ID 为pink的控制器(通过一个标识初始化对应的控制器)
MJTwoViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"pink"];
self.window.rootViewController = vc;
补充:storyboard其实就是特殊的xib文件 xib文件其实就是view
2.直接创建
MJViewController *mj = [[MJViewController alloc] init];
3.指定xib文件来创建 (注意在xib中要File‘s Owner(文件的所有者)右键连接到view上)
MJViewController *mj = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
二、控制器的view的创建
1.
官方图(少了nibName的判断)
2.控制器view的延迟加载(懒加载)
•用到时再加载
•可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
•控制器的view加载完毕就会调用viewDidLoad方法(控制器的view只创建一次所以viewDidLoad也只调用一次)
三、控制器view的生命周期
/**
* view加载完毕
*/
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"MJOneViewController-viewDidLoad");
}
/**
* view即将显示到window上
*/
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"MJOneViewController-viewWillAppear");
}
/**
* view显示完毕(已经显示到窗口)
*/
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"MJOneViewController-viewDidAppear");
}
/**
* view即将从window上移除(即将看不见)
*
*/
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"MJOneViewController-viewWillDisappear");
}
/**
* view从window上完全移除(完全看不见)
*
*/
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"MJOneViewController-viewDidDisappear");
}
/**
* view即将销毁的时候调用
*/
- (void)viewWillUnload
{
[super viewWillUnload];
}
/**
* view销毁完毕的时候调用
*/
- (void)viewDidUnload
{
[super viewDidUnload];
// 由于控制器的view已经不在了,需要显示在view上面的一些数据也不需要
self.apps = nil;
self.persons = nil;
//
// [self.apps release];
// [self.persons release];
}
/**
* 当接收到内存警告的时候
*/
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
内存警告处理(先传到AppDelegate 对象里的applicationDidReceiveMemoryWarning:方法对整个app内存处理 再传到控制器里的
didReceiveMemoryWarning:方法掉super方法自动把没有显示在Window上的控制器的view移除nil 在MRC下还需在viewDidUnload :方法如下图
四、多控制器管理
1.理解对多控制的管理
•一个iOS的app很少只由一个控制器组成,除非这个app极其简单
•当app中有多个控制器的时候,我们就需要对这些控制器进行管理
•有多个view时,可以用一个大的view去管理1个或者多个小view
•控制器也是如此,用1个控制器去管理其他多个控制器
•比如,用一个控制器A去管理3个控制器B、C、D
Ø控制器A被称为控制器B、C、D的“父控制器”
Ø控制器B、C、D的被称为控制器A的“子控制器”
•为了便于管理控制器,iOS提供了2个比较特殊的控制器
1.UINavigationController
2.UITabBarController
可轻松管理多个控制器,轻松完成控制器之间的切换
2.UINavigationController的简单使用
(1)UINavigationController的使用步骤
Ø初始化UINavigationController
Ø设置UIWindow的rootViewController为UINavigationController
Ø根据具体情况,通过push方法添加对应个数的子控制器
// 1.创建导航控制器
MJOneViewController *one = [[MJOneViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:one];
// 存放所有子控制器的栈
// nav.viewControllers
// 这个数组也存放子控制器
// nav.childViewControllers
// 2.添加子控制器
// MJOneViewController *one = [[MJOneViewController alloc] init];
// [nav addChildViewController:one];
// [nav pushViewController:one animated:YES];
// nav.viewControllers = @[one];
// 3.设置为窗口的根控制器
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
(2)UINavigationController的子控制器
•UINavigationController以栈的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
•使用push方法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
•使用pop方法可以移除控制器
Ø将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
Ø回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
Ø回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
(3)UINavigationController的view结构(简单的理解复杂的需更深的挖掘 用递归把其子view都打印出来)
(4)如何修改导航栏的内容
•导航栏的内容由栈顶控制器的navigationItem属性决定
•UINavigationItem有以下属性影响着导航栏的内容
Ø左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
Ø中间的标题视图
@property(nonatomic,retain) UIView *titleView;
Ø中间的标题文字
@property(nonatomic,copy) NSString *title;
Ø左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
ØUIBarButtonItem *rightBarButtonItem 右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
(5)深层挖掘 UINavigationController是如何管理控制器的?(只有导航控制器可以操作push(推入)pop(跳出))
当one控制器被push进来 one控制器会被放入栈里 既是栈底又是栈顶 这时one控制器的view会被创建并放到导航控制器的view上
当two控制器被push进来 two控制器会被放入栈里 two控制器称为栈顶 这时two控制器的view会被创建并放到导航控制器的view上,one控制器的view处于休息状态并未销毁
当three控制器被push进来 three控制器会被放入栈里 three控制器称为栈顶 这时three控制器的view会被创建并放到导航控制器的view上,two控制器的view处于休息状态并未销毁
当three控制器pop出来 two控制器位于栈顶 所以显示two控制器的view 这时three控制器被销毁其view也销毁了
补充知识:
1.iOS7特性是全屏化 window全屏显示 控制器的view也全屏显示 在导航控制器中导航条的颜色可以同化状态栏的颜色,其导航栏高度还是44容易误认为是64