我正在处理一些需要重构的代码。视图控制器充当其他两个视图控制器的容器,并将在它们之间交换,如下面的代码所示。
这可能不是最好的设计。可能不需要以这种方式交换视图控制器。我明白那个。但是,当我使用此代码时,我想进一步了解 addChildViewController 调用会发生什么。我无法在苹果的文档或相关问题中找到答案,在这里(可能表明设计需要改变)。
具体来说 - 容器视图控制器如何处理被要求添加已经添加的子视图控制器的情况?它是否认识到它已经添加了该视图控制器对象?
例如。如果下面的代码位于一个方法内 - 并且该方法被调用两次......
[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];
[viewControllerA willMoveToParentViewController:nil];
[viewControllerA.view removeFromSuperview];
[viewControllerA removeFromParentViewController];
谢谢,
加文
一般来说,他们的视图控制器“遏制”指南 http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html,当其中一个包含另一个时,应遵循以确定是否需要实施遏制。
特别是,担心两次添加相同的子视图控制器就像担心两次呈现相同的视图控制器一样。如果你真的考虑清楚了,你就不需要面对这个问题。你的预感是正确的。
我同意苹果的文档应该更预先地说明奇怪的参数或乱序调用时会发生什么,但这也可能是不想将自己与纠错设计联系起来,这会在路上造成麻烦。当你设计出一个永远不会以错误的方式调用这些方法的设计时,你就正确地解决了问题,并使自己独立于它们可能有或没有的任何错误纠正——如果你考虑到这一点,那就更重要了,因为它不是据记录,错误纠正将来可能会以不同的方式工作,从而破坏您的应用程序。
更进一步,您会注意到 Apple 的容器视图控制器无法进入无效状态(至少使用公共 API 不容易)。与一个UITabViewController
,从一个视图控制器切换到另一个视图控制器是一项原子操作,并且选项卡视图控制器在任何时间点都准确地知道发生了什么。它最多要做的就是删除活动的并显示新的。唯一一次它把所有东西都从水中吹出来的时候是当你告诉它“你应该把所有东西从水中吹出来并开始使用这些视图控制器”时。
为其他任何事情编写代码,例如删除all意见或all视图控制器,无论在某些情况下看起来是否方便或强大,但事实恰恰相反,因为实际上代码的一端不信任代码的另一端来保留其交易的一部分。在任何真正对您有帮助的情况下,这意味着您让人们随意添加视图控制器,而没有您应该想要的控制,在这种情况下,that's你应该解决的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)