Advertencia: no se recomienda presentar controles de vista en controladores de vista separados

En mi aplicación, estoy usando un controlador de navegación. Más tarde, en alguna vista, estoy usando presentViewController para mostrar una imagen ampliada. Además, no estoy usando Storyboard o Nib.

Estoy recibiendo este error solo en iOS 7. Funciona bien en iOS 6 y antes:

Se desaconseja presentar controladores de vista en controladores de vista separados

Para evitar recibir la advertencia en una navegación de inserción, puede usar directamente:

 [self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil]; 

Y luego, en su controlador de vista modal, cuando todo haya terminado, puede simplemente llamar:

[self dismissViewControllerAnimated:YES completion:nil];

El motivo de esta advertencia es que estaba presentando un controlador de vista en una vista pequeña que no es de tamaño completo. A continuación se muestra la imagen de mi proyecto. donde al hacer clic en cuatro opciones arriba. El usuario navega a la vista diferente de childviewcontroller. (Funciona como tabViewcontroller). Pero el controlador de vista de hijos contiene una vista de tamaño pequeño. Entonces, si presentamos una vista desde childviewcontroller, se muestra esta advertencia.

vista de detalle maestra

Y para evitar esto, puede presentar una vista en el padre del controlador de childview

  [self.parentViewController presentViewController:viewController animated:YES completion:nil]; 

Espere a viewDidAppear() :

Este error también puede surgir si está intentando presentar el controlador de vista antes de que realmente aparezca la vista, por ejemplo, presentando vista en viewWillAppear() o anterior. Intenta presentar otra vista después de viewDidAppear() o dentro de ella.

En mi caso, he agregado una vista del ejemplo sampleViewController como una subvista, luego trato de presentar un popover desde la vista de sampleViewController (aquí en lugar de una instancia de UIViewController ):

 [self.view addSubview:sampleViewController.view]; 

El camino correcto debería ser a continuación:

 // make sure the vc has been added as a child view controller as well [self addChildViewController:sampleViewController]; [self.view addSubview:sampleViewController.view]; [sampleViewController didMoveToParentViewController:self]; 

Por cierto, esto también funciona para el caso que presente un popover de una celda de vista de tabla, solo necesita asegurarse de que el controlador de tabla de vista también se haya agregado como controlador de vista infantil.

Creo que el problema es que no tienes una jerarquía de controlador de vista adecuada. Configure el controlador de visualización de la raíz de la aplicación y luego muestre las vistas nuevas presionando o presentando nuevos controles de vista en ellas. Deje que cada controlador de vista administre sus vistas. Solo los controladores de vista de contenedor, como el control tabbarview, deberían agregar vistas de controladores de vista a sus propias vistas. Lea la guía de progtwigción de los controladores de vista para obtener más información sobre cómo usar los controladores de visualización correctamente. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/

Tengo casi el mismo problema. La razón fue que traté de presentar “algún” controlador en otro y después de que la animación se completó estaba configurando el controlador presentado como root. Después de esta operación, todos los demás controladores que se presentan me llevan a la advertencia: “No se recomienda presentar controladores de vista en controladores de vista separados “. Y resuelvo esta advertencia simplemente configura el controlador “algunos” como root sin ninguna presentación al principio.

Remoto:

 [[self rootController] presentViewController:controller animated:YES completion:^{ [self window].rootViewController = controller; [[self window] makeKeyAndVisible];}]; 

Simplemente haga como raíz sin ninguna presentación:

  [[self window] setRootViewController:controller]; 

Una de las soluciones a esto es si tienes un controlador de visión infantil. Así que simplemente presentas el controlador de vista en su padre dando

 [self.parentViewController presentViewController:viewController animated:YES completion:nil]; 

Y para descartar, use el mismo controlador de desestimación.

 [self dismissViewControllerAnimated:YES completion:nil]; 

Esta es la solución perfecta que funciona para mí.

Utilice [self.navigationController presentViewController:xxx animated:YES completion:nil] en iOS 8.

Prueba este código

 UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:]; [self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil]; 

Swift 3

Para cualquiera que tropiece con esto, aquí está la respuesta rápida.

 self.parent?.present(viewController, animated: true, completion: nil) 

necesita agregar el controlador de vista que presentará el nuevo controlador como elemento secundario del controlador de vista principal.

Digamos que tiene su MainViewController, luego agrega un nuevo controlador llamado controllerA, y luego desea presentar un controlador nuevo llamado controllerB de controllerA

tienes que escribir algo como esto:

 [self addChildViewController:controllerA]; //self is yourMainViewController [self.view addsubView:controllerA.view]; 

y dentro del controllerA puede presentar el nuevo controlador sin advertencias

 [self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA 

Ya, incluso me enfrenté al mismo mensaje de advertencia mientras mostraba el controlador Alert que está en otra vista. más tarde lo evité presentando el controlador de alerta del controlador de vista padre como se muestra a continuación

 [self.parentViewController presentViewController:alertController animated:YES completion:nil]; 

Intenta presentar en TabBarController si es una aplicación basada en TabBarController .

 [self.tabBarController presentViewController:viewController animated:YES completion:nil]; 

La razón podría ser self es hijo de TabBarController y está tratando de presentar desde un ChildViewController .

Asegúrese de tener un controlador de vista raíz para comenzar. Puede configurarlo en didFinishLaunchingWithOptions .

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window setRootViewController:viewController]; } 

Muchas razones para esta advertencia. El mío es porque tengo un segue conectado desde un ViewController a otro que se presentará de forma modal. Pero, el ViewController del que estoy presentando se genera dinámicamente por un PageViewController. Por eso está separado en el Storyboard. Mi aplicación no se bloqueará por eso; pero me gustaría silenciar la advertencia.

Depende si desea mostrar su alerta o algo similar en cualquier lugar del tipo UIViewController.

Puede usar este ejemplo de código:

 UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil]; [alert addAction:cancelAction]; [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil]; 

En Swift 4.1 y Xcode 9.4.1

La solucion es

 DispatchQueue.main.async(execute: { self.present(alert, animated: true) }) 

Si escribes así estoy obteniendo el mismo error

 let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert) let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert.addAction(defaultAction) present(alert, animated: true, completion: nil) 

Estoy recibiendo el mismo error

 Presenting view controllers on detached view controllers is discouraged . 

La solución completa es

 let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert) let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in }) alert.addAction(defaultAction) //Made Changes here DispatchQueue.main.async(execute: { self.present(alert, animated: true) })