UIViewControllerHierarchyInconsistency

我正在尝试构建我的应用程序,并且在某一点上我推动了一个UIViewController然后我得到了这个错误。 我不确定为什么。

‘UIViewControllerHierarchyInconsistency’,原因:’视图一次只能与一个视图控制器关联! 视图>与…相关联。 在将此视图与。关联之前清除此关联。

PageViewController *viewController; viewController = [[PageViewController alloc] initWithManagedObjectContext:managedObjectContext]; dataSource = [[PagesDataSource alloc] initWithManagedObjectContext:managedObjectContext]; PVPage *selectedPage = [[dataSource pages] objectAtIndex:itemIndex]; [viewController setRepresentedPage:selectedPage]; PageFlipperAppDelegate *appDelegate = (PageFlipperAppDelegate *)[[UIApplication sharedApplication] delegate]; [(UINavigationController *)[[appDelegate window] rootViewController] setToolbarHidden:YES animated:YES]; [(UINavigationController *)[[appDelegate window] rootViewController] pushViewController:viewController animated:YES]; 

在我的pageViewController ……………….

 - (id)initWithManagedObjectContext:(NSManagedObjectContext *)initManagedObjectContext { if ((self = [super initWithNibName:@"PageView" bundle:nil])) { [self setManagedObjectContext:initManagedObjectContext]; dataSource = [[PagesDataSource alloc] initWithManagedObjectContext:[self managedObjectContext]]; } return self; } 

当我想要一个设置滚动视图出现在弹出框中时,我出现了同样的错误。

这是我的原始代码,其中包含有关我更改以解决此问题的注释:

 SettingsViewController *settingsViewController; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; settingsViewController = [storyboard instantiateViewControllerWithIdentifier:@"Settings"]; CGRect contentRect = CGRectMake(10, 10, 320, 700); // This entire object got deleted in the fixed version UIViewController *popoverContent = [[UIViewController alloc] init]; popoverContent.view = settingsViewController.view; popoverContent.contentSizeForViewInPopover = contentRect.size; // Instead of popoverContent I just put the settingsViewController in directly. UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent]; [popoverController presentPopoverFromRect:[sender frame] inView:(UIButton*)sender permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 

popoverContent.view = settingsViewController.view是导致崩溃的原因(没有它我的popover当然是空的)。 从UIViewControllerHierarchyInconsistency错误的角度来看,我不应该重新分配它然后将它添加到另一个视图控制器。

在你的情况下,我猜在pushViewController或你的代码中的其他地方发生了类似的事情。 可能就是这样吗?

问题场景:如果在同一个.XIB文件中有两个UIViewControllers,其中视图出口指向同一个视图,则在加载nib时会引发UIViewControllerHierarchyInconsistencyexception,例如通过调用其中一个视图控制器上的.view属性。

只是为了添加Matt和owenfi的答案,在一般情况下(或至少我到目前为止看到的情况)这种情况发生在为UIViewController创建自定义XIB时,在Interface Builder中你添加了一个View Controller和一个View来查看你的视图object是View Controller的子视图。

这会导致视图的出口既设置为IB中的UIViewController ,又设置为设置为文件所有者的类,因此设置为UIViewControllerHierarchyInconsistencyexception。

有关解释此问题的屏幕截图,请参阅此答案 。

迁移到iOS 6后,我遇到了与popover控件相同的问题。但是,我的实现与此处的答案略有不同。 所以,我想分享我的解决方案:

我在xib中有一个视图但它在弹出视图中显示在屏幕上不同位置的不同数据。 当我显示视图时,我创建了一个UIViewController并将我的视图指定为控制器的视图。 它在第一次工作,但是当我第二次尝试显示它时,它崩溃了UIViewControllerHierarchyInconsistency。 所以,我定义了一个全局UIViewController,如下面的代码所示。

崩溃:

 -(void) showInTrainWindow:(int)trainLegId onView:(UIView *)view { //update labels on vwTrain for trainLegId [self prepareInTrainProperties:trainLegId]; UIViewController* popoverContent = [[UIViewController alloc] init]; popoverContent.view = vwInTrain; //IT WAS CRASHING ON THIS LINE popoverContent.contentSizeForViewInPopover = CGSizeMake(vwInTrain.frame.size.width, vwInTrain.frame.size.height); self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent]; self.popoverController.delegate = self; [self.popoverController presentPopoverFromRect:CGRectMake(325, view.frame.origin.y - scrollViewTimeLine.contentOffset.y + 65, 1, 1) inView:vwTimeLine permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; [popoverContent release]; } 

固定:

 -(void) showInTrainWindow:(int)trainLegId onView:(UIView *)view { //update labels on vwTrain for trainLegId [self prepareInTrainProperties:trainLegId]; if ( self.popoverContentInTrain == nil ) { self.popoverContentInTrain = [[UIViewController alloc] init]; self.popoverContentInTrain.view = vwInTrain; self.popoverContentInTrain.contentSizeForViewInPopover = CGSizeMake(vwInTrain.frame.size.width, vwInTrain.frame.size.height); } self.popoverController = [[UIPopoverController alloc] initWithContentViewController:self.popoverContentInTrain]; self.popoverController.delegate = self; [self.popoverController presentPopoverFromRect:CGRectMake(325, view.frame.origin.y - scrollViewTimeLine.contentOffset.y + 65, 1, 1) inView:vwTimeLine permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; } 

如果您不遵循以下准则,也会发生此错误: 创建自定义内容视图控制器

基本上,你需要打电话:

[yourVC removeFromParentViewController];

如果你的话

[parentVC addChildViewController:yourVC];

此错误通常可能与“活动视图控制器”的某些内容配对

我坚持的原因之一是我将ViewControllerstoryboard复制到xib文件,以便xib编程方式加载。 但是在xib中我应该复制视图而不是整个视图控制器。 并将file owner设置为我的自定义视图控制器。 这解决了我类似的错误问题。