objective alerta ios swift xcode xcode7 mapbox-gl

ios - alerta - Intentando cargar la vista de un controlador de vista mientras está desasignando... UIAlertController



uialertcontroller swift 4 (7)

Estoy construyendo con la versión de lanzamiento de Xcode 7.0. Sin guiones gráficos, solo archivos de punta.

Tengo un UINavigationController único creado por el delegado de la aplicación y lo inicializo con un controlador de vista.

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIViewController *viewController = [[TGMainViewController alloc] initWithNibName:nil bundle:nil]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; self.navigationController.navigationBar.barStyle = UIBarStyleBlack; self.navigationController.navigationBar.hidden = YES; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible];

Después de navegar a una vista nueva usando:

TGRoutePreparationViewController *viewController = [[TGRoutePreparationViewController alloc] initWithNibName:nil bundle:nil]; [self.navigationController pushViewController:viewController animated:YES];

Luego regresando usando:

[self.navigationController popViewControllerAnimated:YES];

Recibo el siguiente error:

Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UIAlertController: 0x7b29a600>)

Si bien uso UIAlertController s en la aplicación, ninguno se utiliza o UIAlertController una instancia antes de recibir este error. Esto solo ocurre cuando se ejecuta con iOS 9.0. Ejecutar bajo iOS 8.4 no produce ningún error. En todos los casos, la aplicación parece funcionar normalmente y la navegación parece estar funcionando.

Sospecho que el error es engañoso, pero ¿cómo puedo solucionarlo?

Per @Nick, aquí está el método dealloc que se usa:

- (void)deregisterNotificationHandlers { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)dealloc { [self deregisterNotificationHandlers]; }


En mi caso, en Swift 3, me había perdido el código siguiente después de agregar la acción

presentViewController(theAlert, animated: true, completion: nil)

Entonces, el código de trabajo es el siguiente

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if (editingStyle == UITableViewCellEditingStyle.Delete) { let title = "Delete ????" let message = "Are you sure you want to delete this item?" let theAlert = UIAlertController(title: title, message: message, preferredStyle: .ActionSheet) let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) theAlert.addAction(cancelAction) let onDelete = UIAlertAction(title: "Delete", style: .Destructive, handler: { (action) -> Void in self.items.removeAtIndex(indexPath.row) self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) }) theAlert.addAction(onDelete) presentViewController(theAlert, animated: true, completion: nil) } }

// Nota que estaba usando una matriz de muestra

var items = ["iPhone", "iPad", "Mac"]


Finalmente pude rastrearlo hasta una variable de clase UIActionSheet dentro de una biblioteca de terceros, Mapbox GL.

Abrí un problema con ese equipo de desarrollo: https://github.com/mapbox/mapbox-gl-native/issues/2475

Crédito parcial (y un voto positivo y una recompensa) a @Aaoli por mencionar tener un UIAlertView como una variable de clase.


Lo resolví moviendo parte de mi código para viewDidAppear . Si utilicé UIAlertController , causaría el mismo problema que usted mencionó y no se mostraría, y lo resolví de la misma manera.

¡Avíseme si eso no funciona!


Tuve el mismo problema con mi UIViewController donde solo estaba declarando variable en mi clase let alert = UIAlertView() sin usarlo aún, estaba fuera de todas las funciones dentro de la clase como variable. al eliminar eso resuelve el problema. así que por favor verifique en su clase si ha definido alertas de UIAlertView o UIAlertViewController así sin usarlo o en la variable de clase.


Tuve el mismo problema cuando traté de eliminar un observador "frame" en mi opinión en una subclase UIViewController . removeObserver este problema envolviendo el removeObserver en un isViewLoaded() . ¿Qué estás exactamente observando?


Tuve este problema al no tener un navigationController ... Sé que suena obvio, pero saltando en varios proyectos, este no tenía un UINavigationController a mano ... para que otros que vengan aquí quieran NSLog su controlador de navegación solo para la cordura también ...


Tuvimos el mismo problema con UIAlertController .

let alert = UIAlertController(title: "", message: "", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: {(action : UIAlertAction!) in //some actions } ))

Me olvidé de agregar la siguiente línea. Debajo de la línea resolvió el problema.

self.presentViewController(alert, animated: true, completion: nil)