所以我有一个 viewController A,它呈现一个模态 viewController B。
然后 B 呈现一个 viewController C。
我想要做的是解雇 viewController B,因为我不再需要它了。有没有一种简单的方法可以解除 B 并将 C 作为 A 的孩子留在屏幕上?
所以我有一个 viewController A,它呈现一个模态 viewController B。
然后 B 呈现一个 viewController C。
我想要做的是解雇 viewController B,因为我不再需要它了。有没有一种简单的方法可以解除 B 并将 C 作为 A 的孩子留在屏幕上?
显然,正如许多人所说,在教科书世界中,这将/应该是代表情况。在哪里A
礼物B
和B
礼物C
。然后什么时候C
完成它会告诉B
which dismissesC
然后B
告诉A
to 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,或者至少是委托。
您可以尝试让 A 符合定义 C 呈现方式的协议,然后让 B 调用 A 来触发 C 的呈现,而不是 B 负责呈现 C 本身。如果 C 可以独立于 B 存在,则 A 有效地充当两者的“父母”。
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.
您可以拥有一个共享实例,其中包含指向根视图控制器的弱指针(此处为 A)。通过使用此指向 A 的指针,使用此共享实例在任何时候从 A 中呈现/关闭 C。
编辑
这是为了跟进 TimD 的回答。在任何情况下,在我提出的方法中,C 和 B 都将从 A 呈现。