viewWillAppear在iOS5中被调用两次

Sno*_*man 5 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];
Run Code Online (Sandbox Code Playgroud)

小智 16

这是-addSubview:方法.

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

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

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

所以它被叫了两次.

看录像"实施的UIViewController遏制"在这里也.


Luk*_*man 10

因为您要显示两次视图.

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

[self.view addSubview:closeVC.view];
Run Code Online (Sandbox Code Playgroud)

第二次将视图的控制器推到当前视图的控制器之上:

[self presentModalViewController:closeVC animated:NO];
Run Code Online (Sandbox Code Playgroud)

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

只需删除其中一条线就可以了(我建议删除addSubview并保留presentModalViewController一条).

  • @mohabitar或者您迁移代码以使用"自动引用计数",您不必再担心保留,释放和自动释放. (2认同)

Wer*_*her 5

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

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}
Run Code Online (Sandbox Code Playgroud)