UIViewController的控制器管理:
iOS5以后,苹果新的API增加了addChildViewController方法,建议在addSubview的同时调用addChildViewController方法将子页面对应的控制器也加到当前ViewController的管理中。对于那些当前暂时不需要显示的subview,只通过addChildViewController把Controller加进去。需要显示时再调用transitionFromViewController方法。
另外,当收到系统的 Memory Warning 的时候,系统也会自动把当前没有显示的 subview unload 掉,以节省内存。
-
添加控制器过程:
//addChildViewController将viewController加入到self的childViewControllers数组里面。 [self addChildViewController:viewController]; //将viewController的view定制frame之后加入到self.view上。 viewController.view.frame = self.view.bounds; [self.view addSubview:viewController.view]; //将self作为参数发送消息给viewController。子控制器的添加结束,生命周期将会正常随父控制器调用。 [viewController didMoveToParentViewController:self];
注意:child controller的view可以加入到parent controller的view上或者其任意subview上。但不可以加入到以外的view上;在addChildViewController:方法中将自动帮你调用willMoveToParentViewController:,不要再显示调用。只需在结束时调用didMoveToParentViewController:即可。
-
移除控制器过程:
//发送消息给self(child controller),将要从parent controller上移除。参数必须是nil [self willMoveToParentViewController:nil]; //移除view [self.view removeFromSuperview]; //从parent controller的childControllers数组中移除 [self removeFromParentViewController];
注意:在removeFromParentViewController中将自动帮你调用didMoveToParentViewController:方法。不要再显示调用。
- 切换控制器过程:
[fromViewController willMoveToParentViewController:nil];
[self addChildViewController:toViewController];
__weak typeof(self) weakSelf = self;
[self transitionFromViewController:fromViewController
toViewController:toViewController
duration:duration
options:options
animations:animations
completion:^(BOOL finished)
{
[fromViewController removeFromParentViewController];
[toViewController didMoveToParentViewController:weakSelf];
if (completion) {
completion(finished);
}
}];
注意:这个方法为两个页面切换提供了animation定制,这个可以方便在非交互情况下的切换时提供了一种动画解决方案;要切换的页面要先addChildViewController:到parent controller上。