1

所以我有一个 viewController A,它呈现一个模态 viewController B。

然后 B 呈现一个 viewController C。

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

4

4 回答 4

2

显然,正如许多人所说,在教科书世界中,这将/应该是代表情况。在哪里A礼物BB礼物C。然后什么时候C完成它会告诉Bwhich dismissesC然后B告诉Ato dismiss B

我认为您实际上是在创建一组模态呈现的视图控制器,相当于一个导航堆栈。我可能会这样实现它。A根视图控制器在哪里。A然后将推入B堆栈并B推入C堆栈。什么时候C完成它可以简单地popToRootViewControllerAnimated:或者popToViewController:A animated:YES如果A不是rootViewController。

B从下面移除C似乎也有问题。但根据您的评论,这听起来并不是一成不变的:

但无论如何,如果我将那个 viewController 放在那里一段时间,它就不是世界末日。——</p>

这至少可以实现相当干净的委托设置。

似乎您基本上知道,当用户完成后,C他们将不再需要B。如果是这种情况,您可以一次盲目地关闭两个或多个视图控制器。一次两个的代码相当简单。(假设 iOS 版本 > 5.0)

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

请注意我说的是盲目的!这段代码是不宽容的,并且会做出假设。例如,最明显的是视图控制器确实有一个presentingViewController,并且该视图控制器有一个presentingViewController. 如果不满足这些条件中的任何一个,则此代码将不执行任何操作。如果您在任何时候重组您的应用程序,这很容易发生。

再说一遍,如果您选择使用这行代码,请非常小心地使用它。请考虑UINavigationController为这个视图层次结构使用 a,或者至少是委托。

于 2012-09-06T05:43:26.603 回答
1

您可以尝试让 A 符合定义 C 呈现方式的协议,然后让 B 调用 A 来触发 C 的呈现,而不是 B 负责呈现 C 本身。如果 C 可以独立于 B 存在,则 A 有效地充当两者的“父母”。

于 2012-09-05T22:36:11.943 回答
1

You might be able to make this work:

  • provide a property on B like "dieOnDismiss"

  • implement 'dismissViewControllerAnimated:YES' in B, and forward the message to super

  • C optionally sets that property

  • when C sends B 'dismissViewControllerAnimated:', B sends the dismiss to super, immediately sends A 'dismissViewControllerAnimated:NO'

Not sure if you can use animated on one transition and have it look right - you may be able to. But if not you can probably just return to A with no animation.

于 2012-09-05T20:30:51.747 回答
0

您可以拥有一个共享实例,其中包含指向根视图控制器的弱指针(此处为 A)。通过使用此指向 A 的指针,使用此共享实例在任何时候从 A 中呈现/关闭 C。

编辑

这是为了跟进 TimD 的回答。在任何情况下,在我提出的方法中,C 和 B 都将从 A 呈现。

于 2012-09-05T22:19:16.870 回答