viewDidDisappear没有被调用

时间:2013-08-08 14:20:54

标签: ios objective-c uinavigationcontroller presentmodalviewcontroller appdelegate

我在一个应用程序上工作,我的视图出现问题[Will / Did]在返回应用程序时消失方法没有被触发。

案例是,我有UINavigationController,它上面有两个视图控制器。当用户按下主页按钮时,用户退出。当他稍后返回应用程序时,以下(简化)代码在我的AppDelegate中运行:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:NO];
    [self.window.rootViewController presentModalViewController:loginViewController animated:NO];
}

当我弹出导航控制器堆栈上的视图控制器时,我希望调用view[will|did]disappear方法。然而,事实并非如此,因为当iOS要解雇这些方法时,它们(显然)不再出现​​在屏幕上。似乎模态视图控制器已经接管了。

如果我没有提供模态视图控制器,则会按预期调用view[will|did]disappear方法。

我的问题是:如果我想调用view[will|did]disappear方法,那么我该如何构建我的代码呢?有没有更好的地方来呈现我的模态loginViewController?

修改:

为了更清楚地展示我的问题,我在这里创建了一个非常简单的测试项目:https://github.com/JohanVase/ModalViewCauseMissingViewDisappearCalls。请尝试多次按照应用中的说明操作,看看我的viewWillDisappear方法中没有发布“资源”。

1 个答案:

答案 0 :(得分:7)

我终于向Apple技术支持部门提出了同样的问题。他们得出结论,这是iOS中的一个错误,因此我向Apple提交了一份错误报告。同样的错误似乎出现在iOS 6和最新的iOS 7(Beta 5)中。

Apple技术支持建议如下:

  

作为一种变通方法,您可以将清理代码移动到单独的方法中   然后AppDelegate会在导航控制器上调用它   顶视图控制器,在它弹出整个导航堆栈之前。

但是,我认为这在视图控制器中暴露了太多我的细节,所以我选择使用willMoveToParentViewController:来实现它。当视图控制器从其父节点中删除时,将调用此方法,并且 正确调用。