我正在运行我的所有应用程序以确保它不仅仅是一个应用程序,并且在我的每个应用程序中,当我在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];
答案 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:]
)