关闭 3 层模态视图
Posted
技术标签:
【中文标题】关闭 3 层模态视图【英文标题】:Dismissing 3 layers of modal view 【发布时间】:2012-11-10 09:18:43 【问题描述】:在我的应用程序中,我有三层模式视图控制器。
1) 所以我的rootViewController
是tabbar
。
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 层模态视图的主要内容,如果未能解决你的问题,请参考以下文章
从 uitabbarController 视图中关闭模态视图