控制器的详解

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

时间: 2024-10-13 07:52:49

控制器的详解的相关文章

前端控制器DispatcherServlet 详解

DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处 DispatcherServlet 主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 1.文件上传解析,如果请求类型是 multipart 将通过 MultipartResolver 进行文件上传解析: 2.通过 HandlerMapping,将请求映射到处理器(返回一个

第四课 Struts的控制器组件详解

Struts的控制器组件 1. Struts的控制器组件组成: –ActionServlet组件:充当Struts框架的中央控制器 –RequestProcessor组件:充当每个子应用模块的请求处理器 –Action组件:负责处理一项具体的请求 2.Struts的控制器组件主要完成的任务: –接收用户请求 –根据用户请求,调用合适的模型组件来执行相应的业务逻辑 –获取业务逻辑执行结果 –根据当前状态以及业务逻辑执行结果,选择合适的视图组件返回给用户 (1)ActionServlet类: –Ac

Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作.方法). 1.1.实现接口Controller定义控制器 Controller是一个接口,处在包org.springframework.web.servlet.mvc下,接口中只有一个未实现的方法,具体的接口如下所示: package org.springframework.web.servlet.

iOS开发——控制器OC篇&UINavigationController&UITabBarController详解

UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationController以栈的形式保存子控制器 @property(nonatomic,copy) NSArray *viewControllers; @property(nonatomic,readonly) NSArray *childViewControllers; 导航控制器之间的跳转: 使用push方法能将某个控制

详解ASP.NET MVC 控制器

1   概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由  一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的交互,并且负责协调Model与View之间数据传递,是ASP.NET MVC框架核心.Controller为ASP.NET MVC框架的核心组成部分,其主要负责处理浏览器请求,并决定响应什么内容给浏览器,但并不负责决定内容应如何显示(View的职责). 文章内容包括:Controller概述.Con

YII2框架详解

yii2框架的安装我们在之前文章中已经提到下面我们开始了解YII2框架 Yii2的应用结构: 目录篇: advance版本的特点是:根目录下预先分配了三个模块,分别是前台.后台.控制台模块. 1.backend 它主要用于管理后台,网站管理员来管理整个系统. assets 目录用于存放前端资源包PHP类. 这里不需要了解什么是前端资源包,只要大致知道是用于管理CSS.js等前端资源就可以了. config 用于存放本应用的配置文件,包含主配置文件 main.php 和全局参数配置文件 param

23、磁盘管理—磁盘阵列(RAID)实例详解

磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 Raid的管理 案例:创建一个raid10+冗余盘 磁盘阵列(RAID)实例详解 Raid(磁盘阵列)级别介绍 Raid有"廉价磁盘冗余阵列"的意思,就是利用多块廉价的硬盘组成磁盘组,让数据分部储存在这些硬盘里面,从而达到读取和写入加速的目的:也可以用作数据的冗余,当某块硬盘损毁后,其他硬盘

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解 在本章中,我们研究生成的Edit方法和视图.但在研究之前,我们先将 release date 弄得好看一点.打开Models\Movie.cs 文件.先添加一个引用: <span style="font-size:14px;">using System.ComponentModel.DataAnnotations;</span> 然后在Movie类中添加以下代码: [Display(

BadVPN详解之--组网原理剖析

这可能是第一篇关于BadVPN原理的中文介绍,所以我恪守职责,希望能将BadVPN的原理阐述清楚,而不仅仅是为了欺世盗名取天下之先. 序:格尔上市 这一段插在这里有点突兀,与BadVPN无关,只是我的一点实感,忽略即可.       明天小小要去厦门演出,今天是什么日子?是小小准备且出发的日子.但是同样在今天,也就是2017年4月21日(写完本文时估计已经到了22日...),上海格尔软件股份有限公司成功上市了.也许你不知道这个公司,确实这公司的业务是很小众,不像BAT布局那般宏大,但这并不意味着