2010-11-29 48 views
4

J'ai un objet UILocalNotification que j'ai configuré avec des intervalles de répétition jour, semaine et mois. Je n'ai aucun problème à accéder à la date d'incendie de l'objet:Comment saisir la date de déclenchement NEXT à partir d'un objet UILocalNotification

[cell.detailTextLabel setText:[notification1.fireDate description]]; 

Mais j'ai de la difficulté à obtenir la prochaine date de déclenchement. Si j'imprimer l'objet notification1 ci-dessus à la console, je reçois ceci:

<UIConcreteLocalNotification: 0x613e060>{fire date = 2010-11-29 03:53:52 GMT, time zone = America/Denver (MST) offset -25200, repeat interval = 16, next fire date = 2010-11-30 03:53:52 GMT} 

Cet objet contient quelque part la valeur ou les données que je dois afficher la prochaine date de feu ... mais je ne peux pas le trouver! Est-ce que quelqu'un sait où je peux l'obtenir par programme?

Merci

+0

Copie http://stackoverflow.com/questions/3984911/next-fire-date-in-uilocalnotification – KingofBliss

+3

Ok ouais Je l'ai vu après avoir posé ma question, mais il n'y avait pas de réponse ... alors que devais-je faire? –

+0

Il est très frustrant que l'objet sache clairement quand la prochaine date d'incendie est mais ne vous l'expose pas. – Lewis42

Répondre

7

Je ne pense pas que la prochaine date d'incendie est disponible comme une propriété mais plutôt calculée à partir fireDate et repeatInterval. Le calcul de la date peut être difficile avec différents fuseaux horaires et d'autres choses désagréables. Dans votre exemple, vous avez choisi une répétition quotidienne et de calculer la prochaine date de feu, vous pouvez faire quelque chose le long des lignes de:

NSCalendar *calendar = localNotif.repeatCalendar; 
if (!calendar) { 
    calendar = [NSCalendar currentCalendar]; 
} 

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 
components.day = 1; 
NSDate *nextFireDate = [calendar dateByAddingComponents:components toDate:localnotif.fireDate options:0]; 

Si vous utilisez un autre intervalle de répétition vous devez modifier le code en conséquence. Si vous deviez utiliser NSMonthCalendarUnit, vous devrez utiliser components.month = 1 à la place.

+0

Salut, merci beaucoup! Je pense que j'ai définitivement une direction solide maintenant –

+7

Ce n'est pas une bonne réponse. Cela ne fait qu'ajouter un élément à la date de début de la notification, il ne compte pas les occurrences de notifications répétées. –

+0

Pour décourager toute suggestion de modification ultérieure de même nature, ne modifiez pas ce post pour indiquer qu'il est incorrect et insérez un lien vers une réponse plus correcte. Au lieu de cela, votez sur les publications et laissez des commentaires si nécessaire. – CubeJockey

9

Pour calculer la prochaine date d'incendie pour une répétition UILocalNotification, vous devez:

  1. Calculez le montant de repeatInterval il y a eu entre la date d'incendie d'origine de la notification (à savoir sa propriété fireDate) et maintenant.
  2. Ajoutez-les à la notification fireDate.

est ici une approche:

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar]; 

NSDateComponents *difference = [calendar components:notif.repeatInterval 
              fromDate:notif.fireDate 
              toDate:[NSDate date] 
              options:0]; 

NSDate *nextFireDate = [calendar dateByAddingComponents:difference 
               toDate:notif.fireDate 
               options:0]; 

Cela fonctionne dans de nombreux scénarios, mais voici un scénario où il ne fonctionnera pas:

Supposons que:

  • de la notification ` fireDate est 01/01 à 2:00 pm
  • la notification repeatInterval est NSDayCalendaryUnit (c.-à-d. répéter tous les jours)
  • La date est maintenant 08/01 à 15h00

Le code ci-dessus calcule la différence de 7 jours (01/01 + 7 jours = 08/01), les ajouter à fireDate , et ainsi réglé nextFireDate à 08/01 à 14h00. Mais c'est dans le passé, nous voulons nextFireDate être 09/01 à 14h00!

Donc, si vous utilisez le code ci-dessus et votre repeatInterval est NSDayCalendaryUnit, puis ajoutez ces lignes:

if ([nextFireDate timeIntervalSinceDate:[NSDate date]] < 0) { 
    //next fire date should be tomorrow! 
    NSDateComponents *extraDay = [[NSDateComponents alloc] init]; 
    extraDay.day = 1; 
    nextFireDate = [calendar dateByAddingComponents:extraDay toDate:nextFireDate options:0]; 
} 

Je marqué cette réponse que la communauté wiki, vous pouvez le modifier si vous avez trouvé une meilleure façon de faire le calcul!

+0

Au lieu de gérer la prochaine date de tir, pouvons-nous sauter le tir à venir? et continuez sur le prochain temps de répétition –

+0

Ceci est presque mais pas tout à fait - la réponse apparemment correcte est ici: http://stackoverflow.com/questions/20926952/detect-next-uilocalnotification-that-will-fire –

0

je voudrais juste ajouter repeatInterval jusqu'à la date se trouve à l'avenir:

-(NSDate*)nextFireDateForNotification:(UILocalNotification*)notification { 
     NSCalendar *calendar = notification.repeatCalendar; 
     if (!calendar) { 
      calendar = [NSCalendar currentCalendar]; 
     } 

     NSDate* date = [notification.fireDate copy]; 
     while (date.timeIntervalSinceNow > 0) { 
      date = [calendar dateByAddingUnit:notification.repeatInterval value:1 toDate:date options:0]; 
     } 
     return date; 
    }