我只是第一次涉足 iOS 开发,我必须做的第一件事就是实现一个 自定义容器视图控制器(我们称之为 SideBarViewController
) ,它可以替换几个可能显示的子视图控制器中的哪一个,几乎完全像一个标准的 标签条控制器。(它基本上是一个 标签条控制器,但是有一个可以隐藏的侧面菜单,而不是一个标签栏。)
根据 Apple 文档中的说明,每当向容器中添加一个子 ViewController 时,我都会调用 addChildViewController
。我用于交换 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
在这里做什么,我意识到我不知道。除了在 .childViewControllers
阵列中添加新的 ViewController
之外,它似乎对任何东西都没有影响。从子控制器视图到我在故事板上设置的子控制器的操作和出口仍然可以正常工作,即使我从未调用 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;
}
... 那么我的应用程序还能正常工作,就我所知!
苹果的文档没有对 addChildViewController
做了什么或者为什么我们应该称之为 addChildViewController
做了很多解释。关于该方法的作用或为什么应该在 UIViewController
类别参考的章节中使用该方法的相关说明的整个范围目前是:
将给定的视图控制器添加为子级。 ... 此方法仅用于由自定义容器视图控制器的实现调用。如果重写此方法,则必须在实现中调用 super。
同一页的前面还有一段:
在将子视图视图添加到视图层次结构之前,容器视图控制器必须将子视图控制器与其自身关联。这允许 iOS 正确地将事件路由到子视图控制器和这些控制器管理的视图。同样,在从视图层次结构中移除子视图的根视图之后,它应该断开该子视图控制器与其自身的连接。要建立或破坏这些关联,容器调用由基类定义的特定方法。这些方法不应该由容器类的客户机调用; 它们只能由容器的实现使用,以提供预期的包含行为。
下面是您可能需要调用的基本方法:
AddChildViewController:
控制器
控制器:
控制器:
但它没有提供任何线索,说明它所谈论的“事件”或“预期包含行为”是什么,或者为什么(甚至何时)调用这些方法是“必要的”。
在苹果文档的“自定义容器视图控制器”部分中的自定义容器视图控制器的例子都调用了这个方法,所以我假设它除了将子 ViewController 弹出到一个数组中之外还有其他重要用途,但是我不知道这个用途是什么。这个方法是做什么的,我为什么要调用它?