0

我试图关闭一个 ViewController 并在其位置呈现另一个 ViewController。

这就是我的代码的样子

[self dismissViewControllerAnimated:NO completion:nil];

            //load currentProjectListViewController
            currentProjectListViewController = [[CurrentProjectListViewController alloc] initWithNibName:@"CurrentProjectListViewController" bundle:nil];

                [self presentViewController:currentProjectListViewController animated:NO completion:nil];

但是由于某种原因,视图会快速闪烁,然后保持不变并像往常一样操作。

我是woundering是我的代码不正确吗?或者我应该在我的代码中的其他地方寻找什么东西。如果是这样,我应该注意什么。

我已经从我的应用程序中调试了废话,但无法找到问题的根源。

另一方面,它不会偶尔但很少会加载下一个视图!但我不知道为什么。

4

1 回答 1

0

我建议你这样做:

[self dismissViewControllerAnimated:NO completion:^{

    currentProjectListViewController = [[CurrentProjectListViewController alloc] initWithNibName:@"CurrentProjectListViewController" bundle:nil];
    [self presentViewController:currentProjectListViewController animated:NO completion:nil];

}];

或者:

-(void)presentOtherVC {

    currentProjectListViewController = [[CurrentProjectListViewController alloc] initWithNibName:@"CurrentProjectListViewController" bundle:nil];
    [self presentViewController:currentProjectListViewController animated:NO completion:nil];
}

....

    [self dismissViewControllerAnimated:NO completion:^{

        [self performSelector:@selector(presentOtherVC) 
               withObject:nil
              afterDelay:0.5f];

    }];

确实,当你调用dismissViewController时,需要一些时间才能生效;在您的代码中,同时(即在同一个运行循环周期内)您还要求操作系统呈现另一个视图控制器。现在,如果您阅读dismissViewControllerAnimated:completion:描述,它会说(我的粗体):

如果您连续呈现多个视图控制器,从而构建一个呈现视图控制器的堆栈,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图控制器上方的所有视图控制器。发生这种情况时,只有最顶层的视图会以动画方式消失;任何中间视图控制器都简单地从堆栈中删除。最顶层的视图使用其模态转换样式被关闭,这可能与堆栈中其他视图控制器使用的样式不同。

因此,您在解除视图控制器的同时呈现新视图控制器之间显然存在冲突。这解释了为什么事情不起作用,以及为什么有时会起作用。这完全取决于这些相互冲突的任务之间的时间安排。

如果你使用dismissViewControllerAnimated我上面展示的完成处理程序,你可以绕过这个问题。

于 2013-10-11T07:44:30.107 回答