码迷,mamicode.com
首页 > 其他好文 > 详细

控制器的详解

时间:2015-07-08 00:29:36      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

控制器是用来处理,监听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

 

 


 

控制器的详解

标签:

原文地址:http://www.cnblogs.com/junhuawang/p/4628821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!