viewWillAppear在iOS5中被调用两次

时间:2011-10-18 16:05:05

标签: iphone objective-c ios5

我正在运行我的所有应用程序以确保它不仅仅是一个应用程序,并且在我的每个应用程序中,当我在iOS5模拟器或设备上运行时,viewWillAppear方法在每个视图上被调用两次。我有一个简单的NSLog(@"1");,每次在我的控制台中出现两次。这只是我,还是正在发生的事情? (它只在iOS4中被调用一次)

这是调用viewWillAppear两次调用视图的代码:

     CloseDoorViewController *closeVC;

     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
            closeVC = [[ CloseDoorViewController alloc] initWithNibName:@"CloseDoorViewIpad" bundle:nil];
        } else {
            closeVC = [[ CloseDoorViewController alloc] initWithNibName:@"CloseDoorViewController" bundle:nil];
        }

        [self.view addSubview:closeVC.view];
        [self presentModalViewController:closeVC animated:NO];

4 个答案:

答案 0 :(得分:16)

这是-addSubview:方法。

添加或删除视图控制器的视图时,必须有人调用视图控制器的“查看事件”方法,例如-viewWillAppear:等。

实际上,它不是-addSubview的推荐方法:/ - 在iOS 5之前自己查看控制器的视图控制器视图,因为它不会调用“查看事件”方法(您可以/应该自己调用它)。相反,建议使用“间接”方式来执行此操作,例如-presentModalViewController:您使用(它代表您调用“查看事件”方法)。

在iOS 5上,Apple改变了-addSubview的行为:/ - removeFromSuperView方法,允许直观视图管理视图控制器。所以现在,当你在viewController的视图中使用这些方法时,将自动调用'View Event'方法。

所以它被召唤了两次。

请参阅here上的视频“实施UIViewController遏制”。

答案 1 :(得分:10)

因为您要显示两次视图。

首次将视图添加为当前视图的子视图:

[self.view addSubview:closeVC.view];

第二次将视图的控制器推到当前视图的控制器顶部:

[self presentModalViewController:closeVC animated:NO];

我不确定为什么在iOS4中viewWillAppear只被调用一次,因为iOS5调用它是正确的,因为你正如上所述两次显示视图。

只需删除其中一行即可(我建议删除addSubview并保留presentModalViewController一行)。

答案 2 :(得分:5)

如果要在视图控制器中恢复旧(iOS 4)行为,则应实现以下方法:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}

答案 3 :(得分:1)

更新:由于您已编辑了问题以包含代码示例,因此很清楚问题是什么。 Lukman上面的答案是正确/优秀的。

包含代码前的原始答案:

我会尝试在此类的-init方法中添加断点(或日志语句)。如果它被击中两次,则正在创建两个视图控制器。

(请注意,如果您尚未覆盖此类中的-init方法,请确保覆盖指定的初始化程序-[UIViewController initWithNibName:bundle:]

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html