6

我正在开发一个带有 UINavigatorController 的应用程序。我在第二个推送的 viewController 中使用方法 viewDidAppear 在外部服务器中查找信息。

好。虽然一开始在 iOS5 中运行良好,但我意识到 viewDidAppear 在 iOS4.3 中没有被调用,所以我将这段代码放在根目录中:

- (void)navigationController:(UINavigationController *)navigationController 
       didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    [viewController viewDidAppear:animated];
}

此后,该应用程序开始在 iOS4.3 中正常运行。但是,在 iOS5 中没有,因为它调用了两次 viewDidAppear (第一次被调用的那个和来自 的那个navigationController:didShowViewController:animated:

我应该怎么做才能只调用一次 viewDidAppear?

非常感谢你

4

5 回答 5

4

如果您在 viewWillAppear-call 中设置某种状态并检查它是否已在后续调用中设置,那么我看到的唯一真正的解决方案(或者更确切地说是 iOS 4.x 的解决方法),例如

-(void)viewWillAppear:(BOOL)animated {
    if (!viewWillAppearCalled) {
        viewWillAppearCalled = YES;

        /* do stuff */
    }
}

然后您可以安全地手动调用它以与 iOS 4.x 兼容。

可以对 viewDidAppear、viewWillDisappear 和 viewDidDisappear 执行相同的操作。

于 2012-01-13T10:21:30.863 回答
2

您可能还有另一个问题(为什么在 iOS 4 上没有调用 viewDidAppear)。

但是,在这方面我也遇到了 iOS 5 和 iOS 4 之间的不一致,因为我使用了自定义容器视图控制器(既不是 UINavigationController 也不是 UITabBarController)。恢复 iOS 4 兼容性的修复方法是在容器视图控制器中实现以下方法:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}
于 2012-05-11T12:50:58.873 回答
1

使用 [[UIDevice currentDevice] systemVersion] 检查用户正在运行的 iOS 版本;如果是 4.3,请调用 viewDidAppear 方法。

于 2011-12-27T15:06:29.800 回答
0

如果它被调用了两次,并且您只能在将代码添加到根导航时才能进行调用,为什么不从 viewDidAppear 中删除代码(您制作的第一个在 iOS5 上运行的代码)并只留下一个有效的代码在 4.3 和 5 中?

于 2011-12-27T20:16:41.710 回答
-1

你不应该viewDidAppear:手动UIKit调用,让它为你调用它。如果您删除手动调用,则应该只调用一次。

于 2011-12-27T15:07:02.867 回答