如何从演示堆栈中删除中间 UIViewController

Posted

技术标签:

【中文标题】如何从演示堆栈中删除中间 UIViewController【英文标题】:How Remove middle UIViewController from presentation stack 【发布时间】:2015-05-21 22:31:29 【问题描述】:

我是一位经验丰富的 ios 开发人员,但我偶然发现了一个我不完全确定如何解决的问题。

比如说我有 3 个 UIViewController,分别是 A、B 和 C。 A 是根,B 出现在 A 之上,C 出现在 B 之上。

B 和 C 使用 presentViewController:animated:completion 呈现: 所以表示堆栈看起来像这样。

[A] -> [B] -> [C]

在我的程序中,我想解雇 B 并且只解雇 B。 dismissViewControllerAnimated:completion: 表示如果我解雇 B,它会要求其 A 解雇 B,然后也会解雇 C。我不要那个。我只想解雇 B,以便 A 选择 C ​​作为它的presentedViewController,就像这样

[A] -> [C]

这可能吗?

--------注意事项-------

我意识到这似乎更适合另一种表示模式,其中 A、B、C 将是共同 parentViewController 下的兄弟姐妹。但我可能不会使用它。

presentingViewController/presentingViewController 模式就像一个双向链表。但是,由于这些属性是只读的,我无法进行任何节点操作。

【问题讨论】:

似乎添加模拟演示动画的子视图将是解决方案 为什么只需要解雇 B?为什么不等到需要解除 C 后再解除 B(这也会解除 C)? 因为 B 将不再被使用,我不希望它留在内存中。 也许你可以在没有动画的情况下关闭视图控制器 B 和 C,然后在没有动画的情况下呈现另一个 C。虽然不太正确。 如果我这样做了,那么它将释放 C。迫使我将所有数据保存在某个地方。然后,如果我再次显示它,它将再次调用 viewDidLoad 并确保它填充了我之前保存的数据。不仅。 C 将闪烁片刻。 【参考方案1】:

您能否使用隐藏导航栏的导航控制器并推送控制器而不是呈现它们(使用模拟演示的推送和弹出动画)。 然后用setViewControllers把ABC栈换成AC栈?

【讨论】:

您在帖子完成之前阅读了它。我说“并推送控制器而不是呈现它们(使用模仿演示的推送和弹出动画)” 但这会导致不需要的后退按钮在呈现而不是按下时不会出现。 所以即使隐藏了导航栏,后退按钮也会出现? 显然不是。但是您不知道 OP 是否需要导航栏。 OP 很可能会显示一个标题和一个或两个按钮。 我不知道,这就是为什么我没有做出这样的假设,我的回答以“你能不能”开头并以问号结尾。因此隐含地询问这种方法是否适合 OP 现有的要求和架构。

以上是关于如何从演示堆栈中删除中间 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中删除页面 - c# windows 8

如何从 Spring Security 中的默认过滤器堆栈中删除一个过滤器?

从堆栈中清除后台活动/活动的正确方法是什么?

如何从模态堆栈优化方式(特定)中删除页面?

从 Tispr 卡片堆栈中删除卡片

如何从导航堆栈中删除 ViewController 并且没有返回到它的选项-Swift