从另一个modalViewController中dismissModalViewController

时间:2012-09-05 20:17:47

标签: objective-c ios uiviewcontroller

所以我有一个viewController A,它提供了一个模态viewController B。

然后B呈现一个viewController C。

我要做的是解雇viewController B因为我不再需要它了。是否有一种简单的方法可以解雇B并将C保留在屏幕上作为A的孩子?

4 个答案:

答案 0 :(得分:2)

显然,正如许多人所说,在教科书世界中这将是/应该是代表情况。 A呈现BB呈现C的位置。然后,当C完成后,它会告诉B取消C,然后B告诉A取消B

我认为你实际上是在创建一组模态呈现的视图控制器,相当于一个导航堆栈。我可能会这样实现它。其中A是根视图控制器。然后AB推送到堆栈上,B会将C推送到堆栈上。完成C后,如果popToRootViewControllerAnimated:不是rootViewController,则只需popToViewController:A animated:YESA

同样从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。