连续closures2个ViewController

我尝试了两种方式连续地解散了2个viewcontrollers,但是其中只有一个被解散了,而不是第二个

方法1

-(void) LoginDone:(NSNotification *)notif { [self dismissViewControllerAnimated:YES completion:NULL]; //previous viewcontroller [self dismissViewControllerAnimated:YES completion:NULL]; //current viewcontroller } 

方法2

 -(void) LoginDone:(NSNotification *)notif { [self dismissViewControllerAnimated:YES completion:NULL]; [[NSNotificationCenter defaultCenter] postNotificationName:@"LoginDone2" object:nil]; } -(void) LoginDone2:(NSNotification *)notif { [self dismissViewControllerAnimated:YES completion:NULL]; } 

我需要find一种方法来连续closures前一个viewcontroller和当前viewcontroller。

这是一个古老的问题,但这似乎正是我目前所遇到的问题。 在这里我做了什么:

  [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

它适用于我。 我希望对某人有用。

通过电话

  [self dismissViewControllerAnimated:YES completion:NULL]; 

你正在告诉self否定所呈现的观点。 告诉两个相同的self对象来消除它所呈现的视图,不会改变结果。 换句话说,根据您对代码的评论, self不能代表“当前视图”和“先前视图”。 self只是代表单个视图的单个控制器,既可以是当前视图,也可以是前一个视图。

为了解决这个问题,你应该把dismissViewControllerAnimated发送给self (呈现最顶层的视图,我假设) 发送前一个视图的其他视图控制器对象。

换句话说,我会期待这样的事情:

 -(void) LoginDone:(NSNotification *)notif { [self dismissViewControllerAnimated:YES completion:NULL]; [self.previousController dismissViewControllerAnimated:YES completion:NULL]; } 

实际上,你可以只发送一条消息给第二个视图控制器,这两个视图都将被忽略( 来源 ):

如果您连续显示多个视图控制器,并因此构build一堆呈现的视图控制器,则在堆栈中较低视图控制器上调用此方法将取消其立即子视图控制器以及堆栈上该子视图上方的所有视图控制器。 当发生这种情况时,只有最顶层的观点才会以animation的方式被驳回。 任何中间视图控制器都可以简单地从堆栈中移除。 最顶层的视图使用其模式转换样式,这可能不同于其他视图控制器在栈中使用的样式。

我知道这是一个老问题,但也许有人会在这个问题上寻找解决scheme,所以这里是:

 -(void) closeModalViews { [previousVC dismissViewControllerAnimated:YES completion:^(void) { [self dismissViewControllerAnimated:YES]; }]; } 

我喜欢JPetric的想法,但首先你必须closures当前视图控制器的视图,只有这样你才能closures呈现视图控制器的视图。

  [self dismissViewControllerAnimated:NO completion:^(void) { [self.presentingViewController dismissViewControllerAnimated:NO completion:nil]; }]; 

据我所知,你正在尝试像下面这样的东西:

  1. 有2个视图控制器。
  2. 你想让他们两个都消失。
  3. 另一个控制器进来

但事实上只有一个控制器显示,为什么你需要解雇2呢?

你可以使用self.view.hidden = true; 在跳动的视图控制器上,同时animation回到第一个视图控制器。 使用[self.presentingViewController dismiss …]不工作,我没有隐藏。