UIViewController的生命周期

iOS基础界面就是通过UIViewController展示的。首先区分content controller和container controller的区别。content controlller就是展示我们当前页面的controller,而container controller就是一个管理content controller的容器,基本就是UINavigationController和UITabbarController,本身它也是继承UIViewController,一个UIViewController压栈就是把它加入到container controller的view上。

下面说一下UIViewController的生命周期:

1. -(void)loadView;  这里用来加载controller的view,一般我们都必须调用[super loadView]来完成对view的加载,当然如果不需要用self.view也可以。然后再对我们需要的子view进行生成和布局。

2.- (void)viewDidLoad; 这里代表view已经加载完成,一般用来处理数据model之类的。

3.- (void)viewWillAppear:(BOOL)animated; Controller将要被加入到当前window的回调,每次push或pop到当前controller就会回调这个函数,代表界面将要展示出来。

4.-(void)viewDidAppear:(BOOL)animated; Controller已经被加入到当前window,也就是push、present或pop的动画已经完成。

{可能被大多数人忽略的是,在每次调用viewWillAppear或viewDidAppear,系统都会调用一下两个函数:

(1)(void)viewWillLayoutSubviews 这个可能很多人忽略了,是5.0才增加的函数,界面将要对子view进行布局。当通话或录音状态中,状态栏下移,也会回调这个函数。

(2)-(void)viewDidLayoutSubviews 这个跟4对应,也是5.0增加的函数,对子view布局完成。

}

一般在上面4个函数,我们已经可以完成界面的展示。记得它们的先后顺序是必须的。至于收到内存警告,在6.0等不同版本controller的不同回调我之前已经介绍过了,就不再介绍了。

关于Container Controller:

这里就只说介绍UINavigationController,本身它就是继承UIViewController,所以它具有上面所说的生命周期。至于什么东西应该放在viewController,什么应该放在navgationController呢,这里说说我的理解。

因为navgationController就是管理controller的容器,所以它处理的应该就是controller的关系。并且在某种意义上,它里面的controller就相当于它的一个子view,所以在navgationController的操作就能控制它里面的每个controller。下面以现在比较流行的手势导航为例:(也就是在二级页面向右滑动就能返回)

@interface TestNavigationController ()

{

UIPanGestureRecognizer *_panGesture;   //手势导航的recognizer

CGPoint _panStartPoint;    //记录开始滑动的point,只有滑动到一定宽度才开启导航

}

@property(nonatomic,retain)UIPanGestureRecognizer *panGesture;

@end

@implementation TestNavigationController

@synthesize panGesture = _panGesture;

- (void)viewDidLoad

{

[super viewDidLoad];

//在navgationController的view添加手势,也就是为每个当前的controller添加了手势

[self.view removeGestureRecognizer:self.panGesture];

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizeralloc] initWithTarget:self

action:@selector(handlePanGesture:)];

panGesture.minimumNumberOfTouches = 1;

panGesture.maximumNumberOfTouches = 1;

panGesture.delegate = self;

self.panGesture = panGesture;

[panGesture release];

[self.view addGestureRecognizer:self.panGesture];

}

-(void)handlePanGesture:(UIPanGestureRecognizer*)pan

{

 //记录开始滑动的point

if(pan.state == UIGestureRecognizerStateBegan){

_panStartPoint = [pan locationInView:self.view];

}

//在滑动结束,判断滑动的距离是不是适合宽度,处理是否返回上级页面

if(pan.state == UIGestureRecognizerStateEnded)   {

CGPoint _endPoint = [pan locationInView:self.view];

if(_endPoint.x - _panStartPoint.x > 70.0f){

//二级页面就能滑动返回

if([self.viewControllers count] > 1){

[self popViewControllerAnimated:YES];

}

}

}

}

#pragma mark UIGestureRecognizerDelegate method    //手势的delegate,处理一些同时进行的手势操作

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

//一般情况下,如果上下滑动幅度太大,应该就是在滑动controller的tableview之类的,就不开启滑动导航

if (gestureRecognizer == self.panGesture) {

CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:self.view];

return ((fabs(translation.x) / fabs(translation.y) > 5.0f) ? YES : NO);

}

return YES;

}

当我们把appDelegate的window.rootViewController设为TestNavigationController,就可以很方便快捷地实现滑动手势导航功能。

下面说一下静态视图modelViewController,通常我们就是用

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion压入一个模态视图。其实静态的概念就是它入栈的方式和动画不同而已。需要注意的是,一个navgationController不可以push一个navgationController,但是可以present一个navgationController。另外,无论是一个viewController,还是navgationController,都可以present一个modelViewController,并且modelViewController并不加入到navgationController的导航栈中。

所以navgationController的topViewController和visibleViewController是不同概念的。topViewController就是导航栈stack的栈顶,也就是不包括modelViewController,而visibleViewController是当前展示的viewController,如果有模态视图就是模态视图,否则就是topViewController。

最后用一句话总结, A viewController is a set of views, A navgationcontroller is a set of viewControllers.

时间: 2024-08-28 06:20:07

UIViewController的生命周期的相关文章

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[

iOS程序的执行顺序 和 UIViewController的生命周期

iOS程序的执行顺序 1 进入程序的入口 进入main函数, 设置AppDelegate称为函数的代理 2  程序完成加载 -[AppDelegate application:didFinishLaunchingWithOptions:] 3 创建window窗口 4 程序被激活 -[AppDelegate applicationDidBecomeActive:] 5 当点击command+H时  程序取消激活状态 -[AppDelegate applicationWillResignActiv

iOS程序执行顺序 AppDelegate及 UIViewController 的生命周期

iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 iOS应用程序的状态切换很重要,而UIViewControler对于iOS这种MVC模式来说尤为重要,基本都要继承自他. 一.iOS程序的启动执行顺序 1 程序的入口 进入main函数, 设置AppDelegate称为函数的代理 2  程序完成加载 -[AppDelegate application:didFinishLaunchingWithOptions:] 3 创建window窗口 4 程序

【iOS】UIViewController的生命周期

UIViewController中存在的2个循环: 在UIViewController中,View存在两个循环:加载循环和卸载循环. 加载循环 1>程序请求controller的view. 2>如果view在内存中,则直接加载.相反,如果不存在,则UIViewController调用loadView方法. 3>loadView方法执行如下操作: 如果你重载了这个方法,则必须创建必要的view并且将一个非nil值传给UIViewController的view属性. 如果你没有重载这个函数,

UIViewController的生命周期及方法调用顺序

ViewController解析 UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放. UIView与UIWindow共同展示了应用程序的用户界面.可以将UIView理解成画布,UIWindow理解成画框.这两个类的继承关系是这样的: NSObject — UIResponder — UIView — UIWindow  (UIWindow

UIViewController的生命周期及iOS程序执行顺序

当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc                                   创建对象,分配空间2.init (initWithNibName) 初始化对象,初始化数据3.loadView                          从nib载入视图 ,通常这一步不需要去干涉.除非你没有使用xib文件创建视图4.viewDidLoad                   载入完成,可以进行自定义数据以及动态创建其他控件5

UIViewController 的生命周期 & iOS程序的启动顺序

当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序 1. alloc                                   创建对象,分配空间 2.init (initWithNibName) 初始化对象,初始化数据 3.loadView                          从nib载入视图 ,通常这一步不需要去干涉.除非你没有使用xib文件创建视图 4.viewDidLoad                   载入完成,可以进行自定义数据以及动态创建其

IOS UIViewController的生命周期

当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序 1. alloc                                   创建对象,分配空间 2.init (initWithNibName) 初始化对象,初始化数据 3.loadView                          从nib载入视图 ,通常这一步不需要去干涉.除非你没有使用xib文件创建视图 4.viewDidLoad                   载入完成,可以进行自定义数据以及动态创建其

UIViewController的生命周期及iOS程序运行顺序

当一个视图控制器被创建,并在屏幕上显示的时候. 代码的运行顺序 1. alloc                                   创建对象,分配空间 2.init (initWithNibName) 初始化对象,初始化数据 3.loadView                          从nib加载视图 ,通常这一步不须要去干涉.除非你没有使用xib文件创建视图 4.viewDidLoad                   加载完毕.能够进行自己定义数据以及动态创建