2010-11-29 2 views
4

У меня есть объект UILocalNotification, который у меня установлен с интервалами повторения день, неделя и месяц. Я не имею никаких проблем вообще получить доступ к дате пожара объекта:Как захватить СЛЕДУЮЩУЮ дату огня из объекта UILocalNotification

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

Но у меня возникли проблемы получения следующей даты пожара. Если напечатать вышеприведенную объект notification1 к консоли, я получаю это:

<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} 

Этот объект содержит где-то значение или данные мне нужно, чтобы отобразить следующую дату огня ... но я не могу найти его! Кто-нибудь знает, где я могу получить его программным путем?

Благодаря

+0

Копия http://stackoverflow.com/questions/3984911/next-fire-date-in-uilocalnotification – KingofBliss 2010-11-29 11:07:34

+3

Ok да Я видел это после того, как задал свой вопрос, но ответа не было ... так что я должен был делать? – 2010-11-30 03:41:31

+0

Очень неприятно, что объект четко знает, когда следующая дата огня, но не раскрывает его вам. – Lewis42 2015-10-15 15:03:19

ответ

7

Я не думаю, что дата следующего пожара доступна как свойство, а рассчитывается из fireDate и repeatInterval. Расчет даты может быть сложным с разными часовыми поясами и другими неприятными вещами. В вашем примере вы выбрали ежедневный повтор и для расчета следующей даты пожара вы можете сделать что-то вдоль линий:

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]; 

Если вы используете какой-то другой интервал повтора вы должны изменить код соответственно. Если бы вы использовали NSMonthCalendarUnit, вам нужно было бы использовать components.month = 1.

9

Для расчета следующего даты огневой повторяющейся UILocalNotification, вы должны:

  1. Выяснить количество repeatInterval там было между первоначальной датой получения уведомления в огне (то есть его fireDate собственности) и в настоящее время.
  2. Добавьте их в fireDate.

Вот один подход:

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]; 

Это работает во многих сценариях, но вот сценарий, при котором он не будет работать:

Предположим, что:

  • уведомлении в ` fireDate - 01/01 at 2:00 pm
  • repeatInterval - NSDayCalendaryUnit (т.е. повторять ежедневно)
  • дата теперь 08/01 в 3:00 вечера

Приведенный выше код будет вычислять разницу до 7 дней (01/01 + 7 дней = 08/01), добавьте их в fireDate , и, таким образом, установить nextFireDate на номер 08/01 в 14:00. Но это в прошлом, мы хотим, чтобы nextFireDate был 09/01 в 14:00!

Так, если используется код выше и ваш repeatInterval является NSDayCalendaryUnit, затем добавьте следующие строки:

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]; 
} 

Я пометил этот ответ, как сообщества вики, не стесняйтесь, чтобы изменить его, если вы нашли лучший способ сделать расчет!

0

я бы просто добавить repeatInterval, пока дата не лежит в будущем:

-(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; 
    } 
Смежные вопросы