UIViewControllerHierarchyInconsistency当试图呈现一个模态视图控制器

尝试用下面的代码展示一个模态视图控制器

MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil]; mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self.navigationController presentModalViewController:mapView animated:YES]; [mapView release]; 

继续收到以下错误

 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x1ed815a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1ed81600>> is associated with <UIViewController: 0x1ed835a0>. Clear this association before associating this view with <MapViewController: 0x1dd947c0>.' 

这是几个月来我没有碰过的一个旧项目,想知道可能会导致这样的错误?

这发生在我最新的Xcode版本中已经两次了。 在这两种情况下,我需要更改UIViewController的XIB文件(在你的情况下,它将是MapViewController.xib:

之前:

在这里输入图像说明

  1. 将主视图移出 View Controller的子项
  2. 从XIB 删除视图控制器(这是没有必要的,因为文件的所有者应该已经是其类):

后:

在这里输入图像说明

在iOS 6模拟器上运行苹果示例audio应用程序MixerHost时遇到此问题。

相当于上面的修复,即通过将View对象拖动到顶层来编辑提供的MixerHostViewController.xib,并放弃现在用来包含它的ViewController,完美地工作(尽pipe在我花了几个小时工作之前看看底层的问题是什么,所以我现在感觉苹果已经完成了 – 似乎他们收紧了一些东西,但是没有打扰到它是否打破了他们的示例应用程序)。

当我的Nib在顶层文件中有一个UIViewController时,我遇到了这个问题。 所以从Nib加载创buildUIViewController ,然后我尝试从我的类,它是在您的代码中的MapViewController的位置使用它。

在我的情况下,解决scheme只是从我的Nib文件中删除UIViewController

你应该这样做

 MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil]; UINavigationController *navCntrlr = [[UINavigationController alloc] initWithRootViewController:mapView]; mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; //hide navigation bar if needed [self.navigationController presentModalViewController:navCntrlr animated:YES]; [mapView release]; 

也许在某些情况下,最好采取另一种方法, 不要从NIB中删除UIViewController,因为一方面,通过从NIB的层次结构中删除视图控制器,将失去自动布局页边距。

为什么不把UIViewController放在你的nib(.xib)中,并在文件所有者类中为它创build一个出口? 然后,不是直接在你的代码中实例化视图控制器,而是使用UINib类加载nib,并在最佳时间(从内存/资源使用的angular度)调用nib实例的instantiateWithOwner()方法来解压NIB,并连接笔尖对象的所有者类的网点。

  @IBOutlet var myViewController: myViewController? var nib : UINib? nib = UINib(nibName: "TheNib", bundle: nil) if (nib == nil) { println("could not load nib: TheNib.xib") } nib!.instantiateWithOwner(self, options: nil)