ViewDid在iOS5中调用了两次

ViewDid在iOS5中调用了两次,ios,uinavigationcontroller,ios5,viewdidappear,Ios,Uinavigationcontroller,Ios5,Viewdidappear,我正在开发一个带有uinavigator控制器的应用程序。我正在使用第二个按下的viewController中的ViewDidEmerge方法在外部服务器中查找信息 嗯。虽然在iOS5中一开始运行良好,但我意识到在iOS4.3中没有调用viewDidAppear,因此我将以下代码放在根目录中: - (void)navigationController:(UINavigationController *)navigationController didShowViewControl

我正在开发一个带有uinavigator控制器的应用程序。我正在使用第二个按下的viewController中的ViewDidEmerge方法在外部服务器中查找信息

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

- (void)navigationController:(UINavigationController *)navigationController 
       didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    [viewController viewDidAppear:animated];
}
此后,该应用程序开始在iOS4.3中正常工作。但是,在iOS5中没有,因为它调用了两次viewdide(第一次调用的是viewdide,第二次调用的是来自
navigationController:didShowViewController:animated:

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


非常感谢

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

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

如果调用两次,并且在将代码添加到根导航时,您只能调用,为什么不从ViewDidDisplay(您在iOS5上创建的第一个代码)中删除代码只保留在4.3和5中都有效的解决方案?

我看到的唯一真正的解决方案(或者更确切地说是iOS 4.x的解决方案),如果您在视图中设置了某种状态,将显示调用,并检查在后续调用中是否已设置,例如

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

        /* do stuff */
    }
}
然后,为了与iOS 4.x兼容,您可以安全地手动调用它


对于ViewDidDisplay、ViewWillEnglish和ViewDidEnglishe也可以执行相同的操作。

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

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

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}

那不是有点脏吗?我知道我可以用那种方法解决它,但我认为应该有更正确的方法。@Ibaivi-有时候你只需要做这些事情。与其用
systemVersion
检查版本,不如检查类的存在,或者是一个类响应一个选择器,该选择器添加到您想要的目标操作系统上。它在iOS5中只调用了一次,但如果我这样做,viewDidAppear将不会在iOS4.3中被调用……您可能应该修复基本问题。在按下视图控制器时,您是否做了任何异常操作?不,Firoze,我已尝试了所有操作,但NavigationController没有在任何视图控制器中调用ViewDidDisplay和ViewWillDisplay。我在第一个选项卡中有一个UITabViewController和一个UINavigationController,它加载了几个viewcontroller老实说,每次我看到一个项目,其中那些生命周期方法是不可靠的,这是因为容器控制器的结构或表示中的常见错误。让人看一下代码。我相信您可以使它在ios4中始终如一地工作,而不会出现任何奇怪的问题。等等,您是说在另一个
UITabBarController
的第一个选项卡中有另一个
UITabBarController