我只是第一次涉足iOS开发,而我要做的第一件事就是实现一个自定义容器视图控制器 -让我们称之为它SideBarViewController
-交换掉它可能使用的几个子视图控制器中的一个显示,几乎完全像标准的Tab Bar Controller一样。(它几乎是一个标签栏控制器,但具有可隐藏的侧菜单而不是标签栏。)
按照Apple文档中的说明,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
的在.childViewControllers
阵,它似乎对任何事情没有影响。即使我从未调用过addChildViewController
,从子控制器的视图到我在情节提要上设置的子控制器的操作和输出仍然可以正常工作,而且我无法想象它还会影响什么。
确实,如果我将代码重写为not call 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可以将事件正确地路由到子视图控制器以及这些控制器管理的视图。同样,在从其子视图层次结构中删除子视图的根视图之后,它应将该子视图控制器与其自身断开连接。为了建立或破坏这些关联,您的容器调用由基类定义的特定方法。容器类的客户端不希望调用这些方法;它们只能由您的容器的实现用于提供预期的容纳行为。
这是您可能需要调用的基本方法:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
但是它并没有提供任何线索来说明它所谈论的“事件”或“预期遏制行为”是什么,或者为什么(甚至何时)调用这些方法是“必要的”。
Apple文档的“自定义容器视图控制器”部分中的自定义容器视图控制器的示例都调用了此方法,因此我认为它具有一些重要的作用,而不仅仅是将子ViewController弹出到数组中,但是我无法确定找出目的是什么。此方法有什么作用,为什么要调用它?