我刚刚第一次涉足 iOS 开发,我要做的第一件事就是实现一个自定义容器视图控制器- 我们称之为SideBarViewController
- 交换它显示的几个可能的子视图控制器中的哪一个,几乎与标准完全相同标签栏控制器。 (这几乎是一个标签栏控制器但有一个可隐藏的侧面菜单而不是标签栏。)
根据苹果文档中的说明,我调用addChildViewController
每当我将子 ViewController 添加到容器中时。我用于交换当前子视图控制器的代码SideBarViewController
看起来像这样:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
然后我开始试图弄清楚到底是什么addChildViewController
在这里,我意识到我不知道。除了贴新的ViewController
in the .childViewControllers
数组,似乎对什么都没有影响。即使我从不调用,从子控制器视图到我在故事板上设置的子控制器的操作和出口仍然可以正常工作addChildViewController
,我无法想象它还会影响什么。
事实上,如果我重写我的代码以不调用addChildViewController
,而是看起来像这样......
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
...据我所知,我的应用程序仍然可以完美运行!
Apple 文档并没有详细说明什么addChildViewController
确实如此,或者为什么我们应该这样称呼它。该方法的作用或为什么应在该方法的相应部分中使用该方法的相关描述的完整范围UIViewController类参考目前是:
将给定的视图控制器添加为子视图控制器。
...
此方法仅旨在由自定义容器视图控制器的实现调用。如果重写此方法,则必须在实现中调用 super。
同一页前面还有这一段:
在将子视图控制器添加到视图层次结构之前,容器视图控制器必须将子视图控制器与其自身关联。这允许 iOS 正确地将事件路由到子视图控制器以及这些控制器管理的视图。同样,当它从视图层次结构中删除子视图的根视图后,它应该断开该子视图控制器与其自身的连接。为了建立或破坏这些关联,您的容器调用基类定义的特定方法。这些方法不适合由容器类的客户端调用;它们只能由容器的实现使用来提供预期的遏制行为。
以下是您可能需要调用的基本方法:
添加ChildViewController:
从父视图控制器中删除
将移动ParentViewController:
didMove ParentViewController:
但它没有提供任何线索来说明它所谈论的“事件”或“预期遏制行为”是什么,或者为什么(甚至何时)调用这些方法是“必要的”。
Apple 文档的“自定义容器视图控制器”部分中的自定义容器视图控制器的示例都调用此方法,因此我认为它除了将子 ViewController 弹出到数组之外还有一些重要的用途,但我无法理解弄清楚那个目的是什么。这个方法有什么作用,为什么要调用它?