Advertencia: - Se desaconseja presentar controladores de vista en controladores de vista separados


En mi aplicación, estoy usando un controlador de navegación. Más adelante en alguna vista estoy usando presentViewController para mostrar una imagen ampliada. Tampoco estoy usando un guion gráfico o plumín.

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

Presentar controladores de vista en controladores de vista separados es desalentado

Author: shim, 2013-11-10

17 answers

Para evitar recibir la advertencia en una navegación push, 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 llamar a:

[self dismissViewControllerAnimated:YES completion:nil];

 194
Author: cdescours,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-08 18:44:11

La razón de esta advertencia es que estaba presentando un controlador de vista sobre una vista pequeña que no es una vista de tamaño completo. A continuación se muestra la imagen de mi proyecto. donde en haga clic en cuatro opción de arriba. El usuario navega a diferentes vistas de childviewcontroller.(funciona como tabViewcontroller). Pero el controlador childviewcontroller contiene una vista de tamaño pequeño. Así que si presentamos una vista desde childviewcontroller da esta advertencia.

vista de detalle maestro

Y para evitar esto, puede presentar una visión sobre padre de childviewcontroller

  [self.parentViewController presentViewController:viewController animated:YES completion:nil];
 59
Author: Gagan Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-08 11:35:34

Espere a viewDidAppear():

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

 41
Author: Azaxis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 12:28:07

En mi caso, he agregado una vista sampleViewController como una subview, luego intento presentar una ventana emergente desde la vista de sampleViewController (aquí self en lugar de una instancia UIViewController):

[self.view addSubview:sampleViewController.view];

El camino correcto debe estar abajo:

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

B. t.w., esto también funciona para el caso que presenta una ventana emergente de una celda tableview, solo necesita asegurarse de que el controlador tableview también se haya agregado como controlador de vista hijo.

 18
Author: Kjuly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-11 08:20:31

Creo que el problema es que no tiene una jerarquía de controladores de vista adecuada. Establezca el rootviewcontroller de la aplicación y luego muestre nuevas vistas empujando o presentando nuevos controladores de vista en ellas. Deje que cada controlador de vista administre sus vistas. Solo los controladores de vista de contenedor, como tabbarviewcontroller, deberían agregar otras vistas de controladores de vista a sus propias vistas. Lea la guía de programación de view controllers para obtener más información sobre cómo usar view controllers correctamente. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/

 16
Author: Daniel Ytterbrink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-30 13:19:07

Tengo casi el mismo problema. La razón fue que traté de presentar" algún " controlador en otro y después de que se completó la animación, estaba configurando el controlador presentado como root. Después de esta operación, todos los controladores adicionales que se presenten me llevan a la advertencia: " Se desaconseja presentar controladores de vista en controladores de vista separados". Y resuelvo esta advertencia solo ajustes" algunos " controlador como root sin ninguna presentación al principio.

Eliminado:

[[self rootController] presentViewController:controller animated:YES completion:^{

       [self window].rootViewController = controller;

       [[self window] makeKeyAndVisible];}];

Solo hacer como raíz sin ninguna presentación:

 [[self window] setRootViewController:controller];
 9
Author: averem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-27 09:57:46

Una de las soluciones a esto es si tiene childviewcontroller, por lo que simplemente presenta viewcontroller en su padre mediante

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

Y para dismiss use el mismo controlador dismissview.

[self dismissViewControllerAnimated:YES completion:nil];

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

 7
Author: Gagan Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-08 11:31:47

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

 6
Author: Tao Fang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-23 07:31:55

Pruebe este código

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];

[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];
 5
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 17:01:13

Swift 3

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

self.parent?.present(viewController, animated: true, completion: nil)
 5
Author: Jeremie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-12 01:00:23

Debe agregar el controlador de vista que presentará el nuevo controlador como hijo del controlador de vista padre.

Digamos que tienes yourMainViewController, luego agregas un nuevo controlador llamado ControllerA, y luego quieres presentar un nuevo controlador llamado controllerB desde ControllerA

Tienes que escribir algo como esto:

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

Y dentro de ControllerA puede presentar el nuevo controlador sin advertencias

[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA
 3
Author: Chuy47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-11 19:52:20

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

[self.parentViewController presentViewController:alertController animated:YES completion:nil];
 3
Author: Sivasagar Palakurthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-23 07:32:34

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

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

Razón podría ser self es hijo de TabBarController y usted está tratando de presentar de un ChildViewController.

 2
Author: Warif Akhand Rishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 10:07:50

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [window setRootViewController:viewController];
}
 1
Author: samwize,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-14 13:55:39

Muchas razones para esta advertencia. La mía es porque tengo un segue conectado de un ViewController a otro que se presentará modalmente. Pero, el ViewController que estoy presentando está siendo generado dinámicamente por un PageViewController. Es por eso que está separado en el guion gráfico. Mi aplicación no se va a bloquear debido a ello; pero me gustaría silenciar la advertencia.

 1
Author: Lee Probert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 15:01:32

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

Puedes 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];
 0
Author: Fabio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 01:20:46

En Swift 4.1 y Xcode 9.4.1

La solución es

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

Si escribo así, obtengo 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 <MyAppName.ViewController: 0x7fa95560Z070>.

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)
})
 0
Author: iOS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 05:37:46