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)