8

我正在处理一些需要重构的代码。视图控制器充当其他两个视图控制器的容器,并将在它们之间进行交换,如下面的代码所示。

这可能不是最好的设计。可能不需要以这种方式交换视图控制器。我明白那个。但是,当我使用此代码时,我想进一步了解 addChildViewController 调用会发生什么。我无法在 Apple 的文档或相关问题中找到答案,这里(可能表明设计需要更改)。

具体来说 - 容器视图控制器如何处理要求添加它已经添加的子视图控制器的情况?它是否认识到它已经添加了该视图控制器对象?

例如,如果下面的代码在一个方法中 - 并且该方法被调用了两次......

[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];

[viewControllerA willMoveToParentViewController:nil];
[viewControllerA.view removeFromSuperview];
[viewControllerA removeFromParentViewController];

谢谢,加文

4

1 回答 1

7

一般来说,当一个包含另一个视图控制器时,应遵循他们的视图控制器“包含”指南,以确定您是否需要实现包含。

特别是,担心添加相同的子视图控制器两次就像担心显示相同的视图控制器两次一样。如果你真的想清楚了,你不应该面对这个问题。你的预感是正确的。

我同意 Apple 的文档应该更清楚地说明奇怪参数或乱序调用时会发生什么,但也可能是不想将自己与错误更正设计联系起来,这会在未来造成麻烦. 当你设计出一个永远不会以错误方式调用这些方法的设计时,你就能正确地解决问题,并使自己独立于它们可能有或可能没有的任何错误纠正——如果你考虑到这一点,那就更重要了,因为它不是记录在案,该错误更正将来可能会以不同的方式工作,从而破坏您的应用程序。

更进一步,您会注意到 Apple 的容器视图控制器不能进入无效状态(至少使用公共 API 不容易)。使用 a UITabViewController,从一个视图控制器切换到另一个是原子操作,并且选项卡视图控制器在任何时间点都知道发生了什么。它所要做的最多就是删除活动的并显示新的。只有当你告诉它“你应该把所有东西都从水里吹出来,然后开始使用这些视图控制器”时,它才会把所有东西都从水中吹出来。

为其他任何事情编码,例如删除所有视图或所有视图控制器,无论在某些情况下看起来是方便还是健壮,但情况恰恰相反,因为实际上代码的一端不信任代码的另一端来保留它是交易的一部分。在任何实际对您有帮助的情况下,这意味着您让人们随意添加视图控制器而没有您应该想要的控制,在这种情况下,这就是您应该解决的问题。

于 2012-10-02T07:54:16.497 回答