2012-07-30 77 views
1

我正在开发一个iPad应用程序,其中有一个类似于网站的导航菜单:想象一下屏幕左侧的一个菜单,其中包含一系列按钮,每次您点击一个按钮时会显示一个不同的控制器。UIViewController遏制做对了吗?

由于某些图形限制,我不能使用os提供的任何容器控制器,所以我决定编写自己的容器类,概念上类似于UITabBarController。我想知道如果我使用的方法是正确的,特别是addChildViewController:didMoveToParentViewController:

使用在我的容器的初始化我这样做:

MAHomeController *home = [[MAHomeController alloc] initWithNibName:@"MAHomeController" bundle:nil]; 
[self addChildViewController:home]; 
[home didMoveToParentViewController:self]; 
homeIndex = [self.childViewControllers indexOfObject:home]; 
[home release]; 

MAConfigHomeController *config = [[MAConfigHomeController alloc] initWithNibName:@"MAConfigHomeController" bundle:nil]; 
[self addChildViewController:config]; 
[config didMoveToParentViewController:self]; 
configIndex = [self.childViewControllers indexOfObject:config]; 
[config release]; 

MAViewerHomeController *viewer = [[MAViewerHomeController alloc] initWithNibName:@"MAViewerHomeController" bundle:nil]; 
[self addChildViewController:viewer]; 
[viewer didMoveToParentViewController:self]; 
viewerIndex = [self.childViewControllers indexOfObject:viewer]; 
[viewer release]; 

正如你可以看到我添加所有内容控制器,并在添加它们后立即调用didMoveToParentViewController:。这个可以吗?

然后处理该内容之间的导航的方法做这样的事情:

// some stuff removed for brevity, mostly configuration stuff 
UIViewController *fromCtrl = [self.childViewControllers objectAtIndex:currentIndex]; 
UIViewController *toCtrl = [self.childViewControllers objectAtIndex:index]; 
self.currentIndex = index; 
[self transitionFromViewController:fromCtrl toViewController:toCtrl duration:0.7 options:opts animations:^(void) {} completion:^(BOOL finished) { 
     if (completion) 
      completion(); 
    }]; 

正如你可以在完成块看,我不叫新转换控制器上didMoveToParentViewController:,因为它是在容器的childViewControllers之前添加。并且我也不移除旧的控制器,因为事实上它保留在childViewCOntrollers阵列中,直到容器控制器被处理掉。

所有的事件都被正确地路由,甚至是嵌套在3个主要事件中的子控制器。此外,内存不应该成为问题,因为模拟内存警告显示时,不可见控制器的视图将被卸载并重新加载。

这个设计好吗?

+0

它工作..? – Dustin 2012-07-30 19:11:52

+0

是的,所有的事件路由到可见的控制器和内存管理正确 – 2012-07-30 21:46:13

+0

然后我没有看到这个问题。如果事实证明,在实践中有一些问题,然后发布更具体的问题。 – Dustin 2012-07-31 12:30:00

回答

1

如果您通读了iOS开发中心的View Controller指南,那么addChildViewController上没有约束:didMoveToParentViewController:这会使您所做的顺序不正确。

我会做的不同的唯一的事情是可能延迟这一点,以便iOS不加载笔尖,直到您真正显示视图。我敢打赌,如果你运行探查器,当你初始化你的父容器时,你将会加载所有的笔尖。

+1

虽然文档似乎没有指定,但从2012年开始,视图控制器上的WWDC会话很明显需要在didMoveToParentViewController之前调用addChildViewController。您还应该在中间将子视图添加到父视图。 – jblocksom 2012-10-05 02:02:13