Question

Je suis en train d'écrire une application iPhone dans lequel j'ai trois comptes à rebours, que chaque jeu une notification locale quand ils sont mis en marche par l'utilisateur (IBAction).

Ma question est, comment puis-je référence à une notification locale existant ailleurs dans le code? J'ai essayé référençant directement comme ce qui tombe en panne:

[[UIApplication sharedApplication] cancelLocalNotification:myNotification];

Et comme celui-ci après la planification de la notification et l'ajouter aux valeurs par défaut de l'utilisateur:

In my scheduling method...
[myDefaults setObject:myNotification forKey:@"myNotification"];
...

And in my cancelling method...
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[[UIApplication sharedApplication] cancelLocalNotification:[myDefaults objectForKey:@"myNotification"]];
[myDefaults synchronize];

Mon application se bloque avec une erreur SIGABRT sur la ligne de cancelLocalNotification ci-dessus. Quelqu'un peut-il me dire où je me trompe?

Merci à l'avance!

Était-ce utile?

La solution

Ok, je l'ai trouvé une solution à mon problème de travail après avoir réfléchi à l'étape par étape. J'ai trouvé que j'allais toute la question tout à fait dans le mauvais sens!

Pour l'essentiel, je l'ai trouvé que vous ne avez pas besoin de notifications locales lorsque l'application est active (par exemple au premier plan). Ainsi, au lieu de mettre la notification locale lorsque la minuterie est démarré, je mis les notifications pertinentes jusques lorsque l'application est sur le point de démissionner.

Je mets ces observateurs dans mon viewDidLoad;

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification 
object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsActive) name:UIApplicationDidBecomeActiveNotification 
object:nil];

et ma méthode appWillResign, je mis en place les notifications pour tous les temporisateurs actifs. Lorsque l'application est reprise, j'annule simplement toutes les notifications.

[[UIApplication sharedApplication] cancelAllLocalNotifications];

En bref, vous ne devriez pas avoir besoin de référencer les notifications ailleurs dans le code. Vous ne les mettre en place quand ils sont absolument nécessaires: lorsque l'application est en tache de fond! Donc, vous ne avez pas vraiment besoin de les « magasin » partout pour une utilisation ultérieure.

Merci pour votre contribution @Learner, vous me mettre sur la aidé bonne voie! : D

Autres conseils

Il est difficile à prévoir, mais généralement SIGABRT vient lorsque vous accédez à un objet nul ou libéré. ??

dans [[UIApplication sharedApplication] cancelLocalNotification:myNotification]; `

il peut être "myNotification" qui est nul.

OU si [myDefaults objectForKey:@"myNotification"] returns nil.

resason possible pour cela peut être que les magasins de NsUserDefaults seulement quelques types de données comme mentionné dans le paragraphe suivant de référence de classe.

Un objet par défaut doit être une liste de propriétés, qui est, une instance de (ou pour une combinaison des collections d'instances de): NSData, NSString, NSNumber, NSDate, NSArray ou NSDictionary. Si vous voulez stocker tout autre type d'objet, vous devez généralement archiver pour créer une instance de NSData.

Qu'est-ce que je peux prédire est that myNotification qui est stocké est de type UILocalNotification. donc probablement le stockage des données est défaillante.

S'il vous plaît déboguer le code supplémentaire et après si les cas ci-dessus ne fonctionnent pas.

Le correctif est de synchroniser la NSUserDefaults. Je suppose que vous venez de définir l'objet et ne pas synchroniser. Dans ce cas l'objet ne sera pas réellement à sauver NSUserDefaults, plutôt qu'à l'objet NSUserDefaults local. Ce que vous devez faire est [defaults synchronize] d'appel après avoir défini l'objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top