viewDidAppear在iOS5中调用了两次

时间:2011-12-27 15:03:27

标签: ios uinavigationcontroller ios5 viewdidappear

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

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

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

此后,该应用程序开始在iOS4.3中正常运行。然而,在iOS5中没有,因为它调用了两次viewDidAppear(首先调用的那个和navigationController:didShowViewController:animated:中的那个)

如果只调用一次viewDidAppear,我该怎么做?

非常感谢

5 个答案:

答案 0 :(得分:4)

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

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

        /* do stuff */
    }
}

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

viewDidAppear,viewWillDisappear和viewDidDisappear可以做同样的事情。

答案 1 :(得分:2)

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

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

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果它被调用两次并且您只能在将代码添加到根导航时进行调用,为什么不从viewDidAppear(您在iOS5上创建的第一个代码)中删除代码并仅保留一个在4.3和5都有效的人吗?

答案 4 :(得分:-1)

您不应该手动拨打viewDidAppear:,请将其留给UIKit为您拨打电话。如果删除手动调用,则只应调用一次。