我正在使用一些我需要重构的代码。视图控制器充当两个其他视图控制器的容器,并将在它们之间进行交换,如下面的代码所示。
这可能不是最好的设计。可能不需要以这种方式交换视图控制器。我明白那个。但是,当我使用这段代码时,我想进一步了解addChildViewController调用会发生什么。我无法在Apple的文档或相关问题中找到答案(这可能表明设计需要更改)。
具体来说 - 容器视图控制器如何处理要求添加已添加的子视图控制器的情况?它是否认识到它已经添加了该视图控制器对象?
E.g。如果下面的代码在方法内 - 并且该方法被调用两次......
[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];
[viewControllerA willMoveToParentViewController:nil];
[viewControllerA.view removeFromSuperview];
[viewControllerA removeFromParentViewController];
谢谢, 加文
答案 0 :(得分:7)
一般情况下,their guidelines for view controller "containment",如果包含另一个,则应遵循以确定是否需要实施遏制。
特别是,担心两次添加相同的子视图控制器就像担心两次呈现相同的视图控制器一样。如果你真的想过,你不应该面对这个问题。你的预感是正确的。
我同意Apple的文档应该更清楚地了解奇怪的参数或不按顺序调用时会发生什么,但也可能是不希望将自己绑定到会导致问题的纠错设计的情况在路上。当你设计出一种永远不会以错误的方式调用这些方法的设计时,你就能正确地解决问题并使自己独立于它们可能或不具备的任何纠错 - 更重要的是如果你考虑到这一点,因为它不是记录在案,纠错可能会在将来有所不同,打破你的应用程序。
更进一步,你会注意到Apple的容器视图控制器无法进入无效状态(至少不容易使用公共API)。使用UITabViewController
,从一个视图控制器切换到另一个视图控制器是原子操作,并且任何时间点的选项卡视图控制器都知道发生了什么。它最需要做的就是删除活动的一个并显示新的一个。只有当你告诉它“你应该将所有东西从水中吹走并开始使用这些视图控制器”时,唯一一次它将所有东西从水中吹走。
编写其他任何内容,例如删除所有视图或所有视图控制器,无论在某些情况下看起来是否合适或强大,但实际上却完全相反代码的一端不信任代码的另一端来保持其交易的一部分。在任何实际上对您有帮助的情况下,这意味着您可以让人们在没有您想要的控制的情况下添加视图控制器,在这种情况下, 您应该解决的问题。