所有呈现的视图控制器都不会被解雇

Posted

技术标签:

【中文标题】所有呈现的视图控制器都不会被解雇【英文标题】:All the presented view controllers are not dismissed 【发布时间】:2017-01-22 13:56:12 【问题描述】:

我有一个 firstViewController 用

显示
[self.navigationController pushViewController:firstViewController animated:true];

然后,当单击第一个 VC 中的一个按钮时,我会呈现第二个:

[self presentViewController:secondViewController animated:true completion:nil];

从第二个开始,我将第三个 VC 呈现为模态:

[thirdVC modalPresentationStyle];
[thirdVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];    
[self presentViewController:thirdVC animated:true completion:nil];

问题是我想在单击最后一个 VC 的验证按钮时显示第一个 VC。所以我不得不解雇第三个和第二个。我在validateAction(在第三个VC)中试过这个:

[[self parentViewController] dismissViewControllerAnimated:true completion:nil];
[self dismissViewControllerAnimated:true completion:nil];

但是结果是第三个VC(模态的)被解除了,从调试器中我可以看到第一个VC被第二个VC覆盖了。

如何同时解雇第二个和第三个 VC 以返回第一个? 注意:我想在解雇其他人后推送 firstVC,因为我必须重新加载数据(在 fristVC viewDidLoad 中)

【问题讨论】:

你可以尝试调用[self dismissViewControllerAnimated:true completion:nil]; [self dismissViewControllerAnimated:true completion:nil]; 两次,一次是为了关闭第三个VC,第二次是为了关闭socondVC。 【参考方案1】:

来自Apple's Documentation:

呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,UIKit 会要求呈现的视图控制器处理解除。

换句话说,第三个 viewController 要求第二个 viewController 关闭其呈现的 viewController,这是第三个。然后第三个 viewController 尝试关闭自己,导致 UIKit 要求第二个 viewController 再次关闭第三个。

您必须向上一层并要求第一个 viewController 关闭其呈现的视图控制器。

第三个 viewController 对表示层级一无所知,这是一种很好的做法。您可以使用委托告诉第一个 viewController 任务已完成。如果您使用故事板,退出转场是一个非常好的选择。

如果您寻址第一个 viewController,您只需调用一次 -dismissViewControllerAnimated:completion:

如果您连续呈现多个视图控制器,从而构建一个呈现视图控制器的堆栈,则在堆栈中较低的视图控制器上调用此方法会关闭其直接子视图控制器以及堆栈上该子视图控制器上方的所有视图控制器。

【讨论】:

所以如果我理解我必须调用 [self dismissViewControllerAnimated:true completion:nil];在 thirdViewController 的 validateAction 中? 这只会关闭thirdViewController。在 secondViewController 上调用 dismissViewControllerAnimated:completion: 也会关闭thirdViewController。您必须在 firstViewController 上调用它才能关闭 secondViewController。

以上是关于所有呈现的视图控制器都不会被解雇的主要内容,如果未能解决你的问题,请参考以下文章

带有呈现的 UIAlertController 的 UINavigationController 被另外解雇

谁应该解雇视图控制器?

在呈现新视图控制器后关闭当前视图控制器 - swift

在当前视图控制器下显示新的视图控制器

我怎样才能解雇第二个在第一个 vc 上模态呈现的第一个 vc

呈现/关闭包含表格的模态视图控制器会使表格下降