UIViewControllerHierarchyInconsistency when trying to present a modal view controller

20,890

Solution 1

This happened to me already twice in the newest Xcode release. In both cases I needed to make changes to the UIViewController's XIB file (In you case it would be MapViewController.xib:

BEFORE:

enter image description here

  1. Move main View out of View Controller's children:
  2. Remove View Controller from the XIB (it is not necessary since File's Owner should be of its Class already):

AFTER:

enter image description here

Solution 2

I had this problem when running Apple's example audio app MixerHost on the iOS 6 simulator.

The equivalent of the above fix, namely to edit the supplied MixerHostViewController.xib by dragging the View object to the top level, and discarding the now-empty ViewController that used to contain it, worked perfectly (though not before I'd spent hours working out what the underlying problem was, so I'm feeling done-over by Apple at the moment - seems they tightened something up but didn't bother to check if it broke their sample apps).

Solution 3

I had this problem when my Nib had a UIViewController in the file at top level. So loading from Nib created that UIViewController, then I tried to use it from my class, which was in the position of MapViewController in your code.

In my case the solution was simply to remove the UIViewController from my Nib file.

Share:
20,890
Sam J.
Author by

Sam J.

Updated on July 17, 2022

Comments

  • Sam J.
    Sam J. almost 2 years

    Trying to present a modal view controller with the following code

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

    Keep getting the following error..

    '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>.'
    

    This is an old project that I havent touched in months, wonder what could cause such an error?

  • Sam J.
    Sam J. over 11 years
    That just chages the error to... 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <UINavigationController: 0x1e59a900>.'
  • Sam J.
    Sam J. over 11 years
    Thanks, but the code from the edited answer takes it back to the same old error.. 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x20579930; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x20558970>> is associated with <UIViewController: 0x20558c50>. Clear this association before associating this view with <MapViewController: 0x2054f4c0>.'
  • Caleb
    Caleb over 11 years
    This sounds like the likely solution. Creating a view controller both in code and in the .xib file is a common mistake.
  • Nathan
    Nathan over 11 years
    Thank you ever so much for documenting this, it helped me with the exact same thing and I'm such a n00b at figuring this out on my own.
  • mgrandi
    mgrandi over 11 years
    I wish i could upvote you more, this solved my problem with using a separate XIB file to represent the view of a custom ViewController that a UIPopupController was using as its contentViewController.
  • sandy
    sandy over 11 years
    can you please give me the flow the details about how to resolve this MixerHost issue?
  • JulianSymes
    JulianSymes over 11 years
    Sorry @sandy I can't think of any more I can add to the above. It's just one mouse click-and-drag and one mouse select and one delete. Have you tried it? Did you get stuck?
  • sandy
    sandy over 11 years
    @user1681572 i fixed it only need to drag the UIview outside that was under the viewcontroller, working fine.. thanks
  • JulianSymes
    JulianSymes over 11 years
    @sandy you are right, the second step, deleting the empty view controller, is not strictly necessary, but since it's sample code that you may come back to later and look at, it's probably a good idea to clean up by deleting it. Otherwise you might waste time wondering why it's there.
  • UIChris
    UIChris over 10 years
    This solution solve my problem as well. However, don't forget to set the view's referencing outlet with its file's owner!
  • Wingzero
    Wingzero about 9 years
    consider if I want a subclass of myViewController to be init from nib file. Your solution cannot get the subclass, still myViewController.