Iphone 视图将在iOS5中被调用两次

Iphone 视图将在iOS5中被调用两次,iphone,objective-c,ios5,Iphone,Objective C,Ios5,我正在运行我的所有应用程序,以确保它不仅仅是一个应用程序,而且在我拥有的每个应用程序中,当我在iOS5模拟器或设备上运行时,viewwillbeen方法在每个视图上都会被调用两次。我有一个简单的NSLog(@“1”),并且每次都会在我的控制台中显示两次。这只是我,还是发生了什么事?(在iOS4中只调用一次) 这是调用调用view的视图的代码将出现两次: CloseDoorViewController *closeVC; if (UI_USER_INTERFACE_IDIOM

我正在运行我的所有应用程序,以确保它不仅仅是一个应用程序,而且在我拥有的每个应用程序中,当我在iOS5模拟器或设备上运行时,
viewwillbeen
方法在每个视图上都会被调用两次。我有一个简单的
NSLog(@“1”),并且每次都会在我的控制台中显示两次。这只是我,还是发生了什么事?(在iOS4中只调用一次)

这是调用调用view的视图的代码将出现两次:

     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];

更新:由于您已将问题编辑为包含一个代码示例,因此很清楚问题所在。上面卢克曼的回答是正确的/极好的

包含代码之前的原始答案:

我会尝试在这个类的
-init
方法中放置一个断点(或log语句)。如果命中两次,则将创建两个视图控制器

(注意,如果尚未重写此类中的
-init
方法,请确保重写指定的初始值设定项,即
-[UIViewController initWithNibName:bundle:


因为您要显示两次视图

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

[self.view addSubview:closeVC.view];
第二次,将视图的控制器推到当前视图的控制器上:

[self presentModalViewController:closeVC animated:NO];
我不确定为什么在iOS4中,
视图只会出现一次,因为iOS5两次调用它是正确的,因为如上所述,您要显示两次视图


只要删除其中一行就可以了(我建议删除
addSubview
并保留
presentModalViewController
one)。

这是-addSubview:方法

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

实际上,在iOS 5之前,不建议您自己-addSubview:/-removeFromSuperView视图控制器的视图,因为它不调用“查看事件”方法(您可以/应该自己调用它)。相反,建议使用“间接”方法来实现这一点,例如-presentModalViewController:youuse(它会代表您调用“查看事件”方法)

在iOS 5上,苹果改变了-addSubview:/-removeFromSuperView方法的行为,允许对视图控制器进行直接视图管理。现在,当您在viewController的视图上使用这些方法时,将自动调用“视图事件”方法

所以叫了两次


另请参见上的视频“实现UIViewController包容”。

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

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}

谢谢,请看编辑。这个代码有什么问题吗?你是在说这个init方法吗:
-(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
Ya每次只被调用一次,我很确定在这种情况下对
-addSubview:
的调用是不必要的。试着去掉那条线,我想问题可能会解决。哦,哇,我不知道。不知道为什么,但我一直都在这么做。问题:如果这是我展示视图的方式,我现在应该在何时何地发布CloseVC?您可以在发布的代码段中发布或自动恢复它-您不再需要拥有引用,因为您不再使用指针。@mohabitar或您迁移代码以使用“自动引用计数”您不必再担心保留、释放和自动释放。如何启用自动引用计数?NM,找到了一个链接:小说明:在iOS<5上向窗口添加视图时调用ViewWillAppeal。这应该是公认的答案。我一直在疯狂地试图弄明白为什么自iOS5以来addSubview/removeFromSuperview的行为一直不同。