dismissViewControllerAnimated:completion:在iOS 7和iOS 8中产生不同的结果

时间:2014-11-12 22:44:25

标签: objective-c ios7 uiviewcontroller ios8

我有一个UIViewController我将调用root,它正在呈现(通过模态segue)另一个UIViewController(firstChild),它正在呈现(再次通过模态segue)一个UINavigationController(topChild)。在顶级孩子中,我会做以下事情:

[root dismissViewControllerAnimated:NO completion:^{
    [root performSegueWithIdentifier:@"ToNewFirstChild" sender:self];
}];

在iOS 7中,其效果是topChild保留在屏幕上,直到segF到newFirstChild完成,然后显示newFirstChild(由root表示)。我喜欢那样。

在iOS 8中,效果是topChild立即从屏幕上移除,firstChild会短暂显示然后被移除,留下root直到segue完成,然后显示newFirstChild(由root显示)。我不喜欢这样。

如果我选择为dismissViewControllerAnimated:completion:设置动画,则会发生以下结果:在iOS 7中,topChild会被动画解散,而不会泄露firstChild(如文档中所公布的那样),将root显示为segue已经完成;并且在iOS8中,topChild立即从屏幕上移除,留下firstChild,它被动画解散(与文档相反!),再次让root显示直到segue完成。

任何想法如何在iOS 8中获得iOS 7中产生的效果(有或没有动画)?我错过了什么?

1 个答案:

答案 0 :(得分:0)

你在这里遇到的麻烦就是你试图在视图控制器的dismissViewControllerAnimated:completion的完成块中调用一个你正在解雇(并因此解除分配)的方法,因此是零星的不可预测的行为。

我建议使用NSNotificationCenter之类的东西在视图控制器被解除时发布通知,并在父(根)控制器中保留一个可以接收通知的处理程序。

在你的根视图控制器中,在某个地方调用它(可能在prepareForSegue?):

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(topChildWasDismissed:)
                                                 name:@"TopChildDismissed"
                                               object:nil];

您还需要根VC中的处理程序方法:

- (void)topChildWasDismissed {
    [self performSegueWithIdentifier:@"ToNewFirstChild" sender:self];
}

然后在你的顶级孩子中:

[self dismissViewControllerAnimated:YES completion:^(void) {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TopChildDismissed" object:self];
}];