所以我有一个viewController A,它提供了一个模态viewController B。
然后B呈现一个viewController C。
我要做的是解雇viewController B因为我不再需要它了。是否有一种简单的方法可以解雇B并将C保留在屏幕上作为A的孩子?
答案 0 :(得分:2)
显然,正如许多人所说,在教科书世界中这将是/应该是代表情况。 A
呈现B
和B
呈现C
的位置。然后,当C
完成后,它会告诉B
取消C
,然后B
告诉A
取消B
。
我认为你实际上是在创建一组模态呈现的视图控制器,相当于一个导航堆栈。我可能会这样实现它。其中A
是根视图控制器。然后A
将B
推送到堆栈上,B
会将C
推送到堆栈上。完成C
后,如果popToRootViewControllerAnimated:
不是rootViewController,则只需popToViewController:A animated:YES
或A
。
同样从B
下方删除C
似乎有问题。但根据你的评论,听起来并不像是这样:
但是,如果我坚持下去,那么它不是世界末日 viewController有一段时间了。 -
这至少可以实现相当干净的委托设置。
似乎你基本上知道当用户完成C
后,他们再也不会需要B
了。如果是这种情况,您可以一次性盲目解除两个或多个视图控制器。一次两个的代码非常简单。 (假设iOS版本> 5.0)
[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];
请注意我一味地说!这段代码不宽容并做出假设。例如,最明显的是视图控制器确实具有presentingViewController
并且该视图控制器具有presentingViewController
。如果未满足这些条件中的任何一个,则此代码将执行 nothing 。如果您在任何时候重组您的应用程序,这很容易发生。
所以再次,如果您选择使用这行代码,请非常小心地使用它。请考虑为此视图层次结构使用UINavigationController
,或至少使用委派。
答案 1 :(得分:1)
你可能能够做到这一点:
在B上提供“dieOnDismiss”
在B中实现'dismissViewControllerAnimated:YES',并将消息转发给super
C可选择设置该属性
当C发送B'dismissViewControllerAnimated:'时,B将dismiss发送给super,立即发送A'dismissViewControllerAnimated:NO'
不确定您是否可以在一次转换中使用动画并让它看起来正确 - 您可以。但如果没有,你可能只是回到A而没有动画。
答案 2 :(得分:1)
您可以尝试使A符合定义C如何呈现的协议,然后让B调用A来触发C的呈现,而不是B负责呈现C本身。如果C可以独立于B存在,则A有效地充当两者的“父”。
答案 3 :(得分:0)
您可以拥有一个包含指向根视图控制器的弱指针的共享实例(这里是A)。使用此共享实例,只要您希望通过使用此指针指向A来显示/解除C.
修改强>
这是为了跟进TimD的答案。在我提出的方法的任何情况下,C和B都将来自A。