UIViewControllerHierarchyInconsistency al intentar presentar un controller de vista modal

Tratando de presentar un controller de vista modal con el siguiente código

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

Sigue obteniendo el siguiente 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>.' 

Este es un proyecto antiguo que no he tocado en meses, me pregunto ¿qué podría causar tal error?

Esto me sucedió ya dos veces en el último lanzamiento de Xcode. En ambos casos, necesitaba hacer cambios en el file XIB del UIViewController (en su caso sería MapViewController.xib:

ANTES DE:

introduzca la descripción de la imagen aquí

  1. Mueve la vista principal de los hijos de View Controller:
  2. Retire View Controller del XIB (no es necesario ya que el propietario del file ya debería ser de su class):

DESPUÉS:

introduzca la descripción de la imagen aquí

Tuve este problema cuando ejecuté la aplicación de audio Apple MixerHost en el simulador de iOS 6.

El equivalente a la solución anterior, a saber, editar el MixerHostViewController.xib suministrado arrastrando el object View al nivel superior y descartando el ViewController ahora vacío que solía contenerlo, funcionó perfectamente (aunque no antes de haber pasado horas trabajando fuera cuál era el problema subyacente, así que me siento superado por Apple en este momento, parece que apretaron algo pero no se molestaron en comprobar si rompió sus aplicaciones de muestra).

Tuve este problema cuando mi Nib tenía un UIViewController en el file en el nivel superior. Entonces, la carga de Nib creó ese UIViewController , luego traté de usarlo de mi class, que estaba en la position de MapViewController en su código.

En mi caso, la solución fue simplemente eliminar el UIViewController de mi file Nib.

Deberías hacerlo así …

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

Tal vez en algunos casos es mejor tomar otro enfoque y no eliminar el UIViewController de la NIB, porque, por un lado, al eliminar el controller de vista de la jerarquía de la NIB, se pierden los márgenes de layout automático.

¿Por qué no simplemente dejar el UIViewController en su punta (.xib) y crear una salida para él en la class de propietario del file? Entonces, en lugar de instanciar el controller de vista directamente en su código, cargue la punta con la class UINib y, en el momento óptimo (desde el punto de vista de uso de resources / memory), invoque el método instantiateWithOwner () de la instancia de nib para desarchivar NIB y conectar el nib se opone a los puntos de venta de la class propietaria.

  @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)