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

时间:2017-01-22 13:56:12

标签: ios objective-c uiviewcontroller

我有一个用

显示的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的验证按钮时显示firstVC。所以我不得不解雇第三个和第二个。我在validateAction(在第三个VC中)尝试了这个:

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

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

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

1 个答案:

答案 0 :(得分:0)

来自Apple's Documentation

  

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

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

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

优良作法是第三个viewController对表示层次结构一无所知。您可以使用委托告诉第一个viewController任务已完成。如果你使用故事板,退出segue是一个非常好的选择。

如果你发现第一个viewController:

,你只需要调用-dismissViewControllerAnimated:completion:一次
  

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