IOS5中的新增方法详解

Posted 雷仔1001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS5中的新增方法详解相关的知识,希望对你有一定的参考价值。

苹果在 ios5 中给 UIViewController 新增加的 5 方法以及一个属性:

addChildViewController: 
removeFromParentViewController:
transitionFromViewController:toViewController:duration:options:animations:completion:
willMoveToParentViewController:
didMoveToParentViewController:
// 属性
@property(nonatomic,readonly) NSArray *childViewControllers



原来的问题

这些新增的方法和属性用于改进我们的编程方式。那么让我们先看看以前的对于 UIViewController 的使用有什么潜在的问题,认清问题,我们才能理解苹果改变的意义。

在以前,一个 UIViewController 的 View 可能有很多小的子 view。这些子 view 很多时候被盖在最后,我们在最外层 ViewController 的 viewDidLoad 方法中,用 addSubview 增加了大量的子 view。这些子 view 大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示 view,上传附件成功的提示 view,网络失败的提示 view 等。但是虽然这些 view 很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些 view 从 super view 中去掉。

改变

苹果新的 API 增加了 addChildViewController 方法,并且希望我们在使用 addSubview 时,同时调用 [self addChildViewController:child] 方法将 sub view 对应的 viewController 也加到当前 ViewController 的管理中。对于那些当前暂时不需要显示的 subview,只通过 addChildViewController 把 subViewController 加进去。需要显示时再调用 transitionFromViewController:toViewController:duration:options:animations:completion 方法。

另外,当收到系统的 Memory Warning 的时候,系统也会自动把当前没有显示的 subview unload 掉,以节省内存。

 

先搞清楚一个今天提到的概念:

 

[父视图控制器 addChildViewController:子视图控制器];

 

在此,图控制器A添加了另一个图控制器B,那么A充当父视图控制器,B充当子视图控制器。父视图控制器充当了视图控制器容器的角色。

 

addChildViewController方法:

 

- (void)addChildViewController:(UIViewController *)childController

向视图控制器容器中添加子视图控制器

 

childController:子视图控制器

 

当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中。

 

removeFromParentViewController 方法

 

- (void)removeFromParentViewController

从父视图控制器中删除。

 

transitionFromViewController 方法

 

- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

 

交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)

 

fromViewController:当前显示的子试图控制器,将被替换为非显示状态

toViewController:将要显示的子视图控制器

duration:交换动画持续的时间,单位秒

options:动画的方式

animations:动画Block

completion:完成后执行的Block

 

willMoveToParentViewController 方法

 

- (void)willMoveToParentViewController:(UIViewController *)parent

当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用

 

parent:父视图控制器,如果没有父视图控制器,将为nil

 

 

注意点:

1.当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:

[将要删除的视图控制器 willMoveToParentViewController:nil];

2.当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。

 

didMoveToParentViewController 方法

 

- (void)didMoveToParentViewController:(UIViewController *)parent

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。

parent:父视图控制器,如果没有父视图控制器,将为nil

 

当我们向我们的视图控制器容器(就是父视图控制器,它调用addChildViewController方法加入子视图控制器,它就成为了视图控制器的容器)中添加(或者删除)子视图控制器后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。

 

removeFromParentViewController 方法会自动调用了该方法,所以,删除子控制器后,不需要在显示的调用该方法了。

其实,这几个方法中的API说明,看的还懂。

 

最后,

 

关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

 

1.这两个方法用在子试图控制器交换的时候调用!即调用transitionFromViewController方法时,调用。

 

2.当调用willMoveToParentViewController方法或didMoveToParentViewController方法时,要注意他们的参数使用:

当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。

即:[将被删除的子试图控制器 willMoveToParentViewController:nil];

当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。

即:[将被加入的子视图控制器 didMoveToParentViewController:父视图控制器];

 

3.无需调用[子视图控制器 willMoveToParentViewController:父视图控制器]方法。因为我们调用[父视图控制器 addChildViewController:子视图控制器]时,已经默认调用了。

只需要在transitionFromViewController方法后,调用[子视图控制器didMoveToParentViewController:父视图控制器];

 

4.无需调用[子视图控制器 didMoveToParentViewController:父视图控制器]方法。因为我们调用

[子视图控制器 removeFromParentViewController]时,已经默认调用了。

只需要在transitionFromViewController方法之前调用:[子视图控制器willMoveToParentViewController:nil]。

以上是关于IOS5中的新增方法详解的主要内容,如果未能解决你的问题,请参考以下文章

ES6新增语法——Promise详解

在 iOS5 视图控制器中创建链接/按钮动态列表的最佳方法

在 iOS5 中自动播放 HTML5 音频/视频

详解es6新增数组方法简便了哪些操作

详解凸优化图神经网络强化学习贝叶斯方法等四大主题

MVC详解(转)