1

我正在开发一个 iPad 应用程序,它具有类似于网站的导航菜单:想象屏幕左侧的菜单带有一系列按钮,每次点击按钮时都会显示不同的控制器。

由于一些图形限制,我不能使用操作系统提供的任何容器控制器,所以我决定编写自己的容器类,在概念上类似于UITabBarController. 我想知道我使用的方法是否正确,尤其是addChildViewController:和的用法didMoveToParentViewController:

在我的容器的 init 中,我这样做:

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 个主控制器内的子控制器也是如此。内存也不应该成为问题,因为通过模拟内存警告,不可见控制器的视图会在显示时被卸载并重新加载。

这个设计好吗?

4

1 回答 1

1

如果您通读 iOS 开发中心的 View Controller 指南,addChildViewController: 和 didMoveToParentViewController: 没有任何约束,这会使您的操作顺序不正确。

The only thing I would do different is potentially delaying this so that iOS does not load the nibs until you actually show the view. I bet you if you run the profiler you will be loading all the nibs when you init your parent container.

于 2012-10-03T14:33:17.367 回答