uialert simple ios objective-c cocoa-touch uialertview stack-trace

ios - simple - Intentando descartar UIAlertController con un presentador desconocido



uialertcontroller swift 3 (3)

Mi aplicación se bloqueó, y debe ser debido a UIAlertController.

Este problema ocurre solo en iOS 8.x donde UIAlertController está disponible. El hecho extraño es que mi aplicación no usa UIAlertViewController ni UIAlertView .

Los informes me dicen:

Trying to dismiss UIAlertController <UIAlertController: 0x172c5d80> with unknown presenter.

¿Cómo puede pasar esto?

Yo pense acerca de

  1. Deshacer System AlertView mostrado gracias al gesto de agitar
  2. WebView se desasignó cuando aún aparece en pantalla un mensaje de solicitud o un cuadro de diálogo genérico
  3. Alerta de batería baja

pero ninguno de estos casos me lleva al accidente.

Lo que me sugiere el registro de errores es el hecho de que el sistema operativo muestra un AlertView que se adjuntará a la ventana de mi aplicación y, en algunas circunstancias, perderá el controlador de vista principal que presentó el UIAlertViewController.

¿Alguna idea de cómo encontrar el problema?

Aquí el rastro de pila

_________________________________ 0 CoreFoundation 0x2bc0c45f __exceptionPreprocess + 127 1 libobjc.A.dylib 0x39c79c8b objc_exception_throw + 36 2 CoreFoundation 0x2bc0c3a5 +[NSException raise:format:] + 110 3 UIKit 0x2f4ad13d -[UIAlertController _dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:] + 414 4 UIKit 0x2f4acf97 -[UIAlertController _dismissAnimated:triggeringAction:] + 28 5 UIKit 0x2f590a0b -[_UIAlertControllerActionView touchesEnded:withEvent:] + 160 6 UIKit 0x2f159567 -[UIWindow _sendTouchesForEvent:] + 520 7 UIKit 0x2f152e31 -[UIWindow sendEvent:] + 542 8 UIKit 0x2f129759 -[UIApplication sendEvent:] + 194 9 UIKit 0x2f39d2f9 _UIApplicationHandleEventFromQueueEvent + 14166 10 UIKit 0x2f1281a9 _UIApplicationHandleEventQueue + 1350 11 CoreFoundation 0x2bbd2fbf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12 12 CoreFoundation 0x2bbd23cf __CFRunLoopDoSources0 + 216 13 CoreFoundation 0x2bbd0a35 __CFRunLoopRun + 770 14 CoreFoundation 0x2bb1e3b1 CFRunLoopRunSpecific + 474 15 CoreFoundation 0x2bb1e1c3 CFRunLoopRunInMode + 104 16 GraphicsServices 0x3308d201 GSEventRunModal + 134 17 UIKit 0x2f18843d UIApplicationMain + 1438 18 MyApp 0x00028a07 main (main.mm:16)

EDITAR

Los agujeros preguntaron sobre mi inicialización de la ventana. Aquí el código de mi AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[MyAppCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; _mainViewController = [[MyAppContainerViewController alloc] initWithNibName:nil bundle:nil]; _mainStatusBarVC = [[MyAppStatusBarVC alloc] initWithRootVC:_mainViewController]; [self.window setRootViewController:_mainStatusBarVC]; [self.window makeKeyAndVisible]; return YES; }


Apuesto a que tu accidente ocurrió en el iPad.

En iPad, desde iOS8, UIActionSheet parece manejarse con un UIAlertController

Con este código,

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if(buttonIndex == 1) return; // Cancel button [self doSomeViewControllerDismisses]; }

Mi aplicación estaba fallando con el mismo error que recibiste.
Para evitar esto, simplemente despacho la llamada de rechazo compleja en la próxima ejecución de MainThread, para dar al UIAlertViewController oculto la oportunidad de liberar correctamente.

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if(buttonIndex == 1) return; // Cancel button dispatch_async(dispatch_get_main_queue(), ^{ [self doSomeViewControllerDismisses]; }); }


Una traza de pila de este formulario generalmente indica que ha navegado lejos de un UIViewController mientras que una alerta de que lo tenía presente aún se está descartando.

El remedio general para esto es presentar o descartar los controladores en el método alertView: didDismissWithButtonIndex: de UIAlertViewDelegate, desde entonces está seguro de que el presentador no desaparecerá durante cualquier despido.

En su caso, si no puede encontrar ningún caso reproducible, puede intentar revisar el controladorViewView presentado antes de presentar / descartar un controlador y ver si eso se enciende.

Pero probablemente si audita las transiciones de su controlador, encontrará en algún lugar que responder a una alerta del sistema podría desencadenar una navegación mediante programación. ¿Tiene alguna funcionalidad que lanza una alerta del sistema para la autorización del usuario, como el acceso a fotos o lo que sea, y negarlo daría lugar a que un controlador se despida programáticamente por su manejo de errores? Eso parece un escenario razonablemente plausible.


intente descartar en el hilo principal Alertview usando Bloquear en el teclado principal.

dispatch_async(dispatch_get_main_queue(), { () -> Void in // Write your alert view code in swift language . })