Hallo,
ich habe ein etwas merkwürdiges Phänomen:
Ich empfange eine Remote Push Notification und möchte bei aktiver Anwendung den Nutzer fragen ob er sich die Details zu der Notification in einem modalen ViewController anschauen möchte. Dazu erzeuge ich ein UIAlertView und erstelle in der clickedButtonAtIndex() meinen ViewController und zeige diesen mithilfe presentViewController() an:
Alles anzeigen
Der ViewController wird (modal) angezeigt und anschließend vom Nutzer wieder geschlossen. --> alles OK.
Jetzt schicke ich die App in den Hintergrund und versende erneut eine Remote Notification und öffne die App per Klick auf die Notification. Die App stürzt mit der Meldung ab:
Die Bedeutung ist mir klar, allerdings verstehe ich die Ursache nicht. Um herauszufinden, wer eine Methode des bereits gelöschten MyViewControllers aufruft, habe ich die respondsToSelector() in MyViewController überschrieben:
Zusätzlich musste ich noch die 37. Zeile ([mv release];) entfernen, damit der ViewController nicht freigegeben wird. Nach Wiederholung der Prozedur erhalte ich folgende Log Meldung:
Was hat es mit der Methode isViewControllerInWindowHierarchy auf sich? Im Netz konnte ich nichts dazu finden.
Jetzt das merkwürdige, erzeuge und präsentiere ich den ViewController direkt in der didReceiveRemoteNotification() (also ohne vorherige Alertabfrage) und wiederhole die Prozedur (mehrmals) bekomme ich keine Exception:
Ist das ein Bug von iOS? Oder hat evtl. jemand eine Erklärung zum merkwürdigen Verhalten bei der Nutzung von einem UIAlertView?
Gruß
Stefan
ich habe ein etwas merkwürdiges Phänomen:
Ich empfange eine Remote Push Notification und möchte bei aktiver Anwendung den Nutzer fragen ob er sich die Details zu der Notification in einem modalen ViewController anschauen möchte. Dazu erzeuge ich ein UIAlertView und erstelle in der clickedButtonAtIndex() meinen ViewController und zeige diesen mithilfe presentViewController() an:
Quellcode
- @interface AppDelegate ()
- @property (retain) NSDictionary *currentLaunchOptions;
- @end
- - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
- UIApplicationState state = [application applicationState];
- // app is running
- if (state == UIApplicationStateActive) {
- self.currentLaunchOptions = userInfo;
- //title, msg, ... anlegen
- [self showAlertForRemoteNotificationWith:title message:msg cancelTitle:@"Abbruch" okTitle:okTitle];
- }
- }
- #pragma mark - Remote Notification AlertView
- - (void) showAlertForRemoteNotificationWith: (NSString*) sTitle message: (NSString*) sMessage cancelTitle: (NSString*) sCancelTitle okTitle: (NSString*) sOkTitle{
- UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:sTitle
- message:sMessage
- delegate:nil
- cancelButtonTitle:sCancelTitle
- otherButtonTitles:sOkTitle, nil];
- alertView.delegate = self;
- [alertView show];
- }
- // Called when a button is clicked. The view will be automatically dismissed after this call returns
- - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
- {
- MyViewController *mv = [[MyViewController alloc] initWithOptions: self.currentLaunchOptions];
- [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:mv animated:NO completion:nil];
- [mv release];
- self.currentLaunchOptions = nil;
- }
Der ViewController wird (modal) angezeigt und anschließend vom Nutzer wieder geschlossen. --> alles OK.
Jetzt schicke ich die App in den Hintergrund und versende erneut eine Remote Notification und öffne die App per Klick auf die Notification. Die App stürzt mit der Meldung ab:
Die Bedeutung ist mir klar, allerdings verstehe ich die Ursache nicht. Um herauszufinden, wer eine Methode des bereits gelöschten MyViewControllers aufruft, habe ich die respondsToSelector() in MyViewController überschrieben:
Zusätzlich musste ich noch die 37. Zeile ([mv release];) entfernen, damit der ViewController nicht freigegeben wird. Nach Wiederholung der Prozedur erhalte ich folgende Log Meldung:
Was hat es mit der Methode isViewControllerInWindowHierarchy auf sich? Im Netz konnte ich nichts dazu finden.
Jetzt das merkwürdige, erzeuge und präsentiere ich den ViewController direkt in der didReceiveRemoteNotification() (also ohne vorherige Alertabfrage) und wiederhole die Prozedur (mehrmals) bekomme ich keine Exception:
Quellcode
- - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
- UIApplicationState state = [application applicationState];
- if (state == UIApplicationStateActive) {
- MyViewController *mv = [[MyViewController alloc] initWithOptions: userInfo];
- [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:mv animated:NO completion:nil];
- [mv release];
- }
- }
Ist das ein Bug von iOS? Oder hat evtl. jemand eine Erklärung zum merkwürdigen Verhalten bei der Nutzung von einem UIAlertView?
Gruß
Stefan