关闭 3 层模态视图

Posted

技术标签:

【中文标题】关闭 3 层模态视图【英文标题】:Dismissing 3 layers of modal view 【发布时间】:2012-11-10 09:18:43 【问题描述】:

在我的应用程序中,我有三层模式视图控制器。

1) 所以我的rootViewControllertabbar

2) 在applicationDidFinishLaunching 上,我正在呈现viewController,例如viewController A 模态在tabbar 上方。

3) 单击“viewController A”中的按钮时,我会以模态方式呈现另一个viewController B

4) 在viewController B 上的按钮操作以模态方式将navigationController 与其rootViewController 呈现为viewController C

5) 最后从viewController C,我想回到viewController A

我尝试过使用

[[[self parentViewController] parentViewController]dismissModalViewControllerAnimated:YES];

viewController C,但它让我回到viewController B而不是viewController A

我怎样才能恢复到viewController A

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

将所有“模态”视图推送到具有类似于 modalTransitionStyle..dont 的转换样式的 navigationControl 上

在一个模态navigationController Id 中呈现所有内容:)

【讨论】:

【参考方案2】:

您有一个复杂的 VC 堆栈。你可以像一位发帖人建议的那样实现一个自定义的dismissView方法,但这会很脆弱:如果你重用这个视图,或者在你的应用程序中移动它,它将停止运行,因为它过于依赖于其他VC如何配置的特定知识他们的状态。

您可以配置委托链。这将是操作视图的标准方式:呈现的 VC 还负责删除它呈现的任何内容。

为此,构建一个由 B 实现的协议,并使用对 B 的引用来初始化 C。类似地,使用对 A 的引用来初始化 B(可能使用相同的协议,具体取决于需要在它们之间传递的任何其他通信)他们。)

然后当 C 上的按钮被点击时,它会调用 B 的委托方法。 B 适当地展开 C,并调用 A 的委托方法。 A 适当地展开 B。

这具有保持 VC 知识封装的优点:A 知道它如何呈现 B,因此它知道如何取消呈现它,而 B 知道它如何呈现 C,并且知道如何取消呈现它。在任何情况下,一个 VC 都不需要假设另一个 VC 是如何呈现它的。

【讨论】:

【参考方案3】:

实现视图关闭方法,如:

- (IBAction)dismissView
 
   [self dismissModalViewControllerAnimated:NO];   // dismiss c
   [[self parentViewController] dismissModalViewControllerAnimated:NO]; //dismiss b
 

[self parentViewController] 将返回viewControllerC 的父视图,即viewControllerB。所以它也会忽略这种观点。

【讨论】:

给出相同的结果。视图控制器 B 出现在屏幕上,而不是视图控制器 A 试一试:写[[[[self parentViewController] parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];会发生什么? 什么都没有!!停留在同一个屏幕上。该死的,这太疯狂了。 @footyapps27: 对不起,伙计:(我也很困惑。如果你得到修复,请发布答案或让我知道 :) 嗨@footyapps27 这可以通过一些解决方法来完成,例如使用一些 bool ivar 来关闭视图控制器 b 会出现 :)

以上是关于关闭 3 层模态视图的主要内容,如果未能解决你的问题,请参考以下文章

如何一次关闭 3 个模态视图控制器?

0188 案例:模态框拖拽

关闭两个模态(表格)视图控制器

从 uitabbarController 视图中关闭模态视图

SwiftUI - 如何关闭假的模态视图 - 从里面的第二个视图,用关闭按钮?

iPad 模态视图关闭更改父视图方向