2016-02-13 3 views
1

Я работаю над функцией, которая позволит пользователям планировать дни и время получения уведомления.Планирование локальных уведомлений

Пока что функция времени и сообщений отлично работает. Где я застрял, это интервал повторения.

Вот что я пробовал:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

     NSString *formatedDate = [dateFormatter stringFromDate:self.datePicker.date]; 
     self.currentTimeLabel.text = formatedDate; 

     NSDate *date = [dateFormatter dateFromString:self.currentTimeLabel.text]; 

     NSCalendar *calendar = [NSCalendar currentCalendar]; 

     NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date]; 
     NSInteger hour = [components hour]; 
     NSInteger minute = [components minute]; 

     [components setHour:hour]; 
     [components setMinute:minute]; 

     if ([self.currentRepeatLabel.text containsString:@"Sun"]) { 
      [components setWeekday:0]; 

      self.notification = [[UILocalNotification alloc] init]; 
      self.notification.fireDate = [calendar dateFromComponents:components]; 
      self.notification.repeatInterval = NSCalendarUnitDay; 
      [self.notification setAlertBody:[NSString stringWithFormat:@"A friendly reminder: %@", self.titleStringToDisplay]]; 

      if (self.soundSwitch.isOn == YES) { 
       self.notification.soundName = @"soundeffect.wav"; 
      } 

      NSDictionary *infoDict = [NSDictionary dictionaryWithObject:self.titleStringToDisplay forKey:@"title"]; 
      self.notification.userInfo = infoDict; 

      [[UIApplication sharedApplication] scheduleLocalNotification:self.notification]; 
     } 
     if ([self.currentRepeatLabel.text containsString:@"Mon"]) { 
      [components setWeekday:1]; 

      self.notification = [[UILocalNotification alloc] init]; 
      self.notification.fireDate = [calendar dateFromComponents:components]; 
      self.notification.repeatInterval = NSCalendarUnitDay; 
      [self.notification setAlertBody:[NSString stringWithFormat:@"A friendly reminder: %@", self.titleStringToDisplay]]; 

      if (self.soundSwitch.isOn == YES) { 
       self.notification.soundName = @"soundeffect.wav"; 
      } 

      NSDictionary *infoDict = [NSDictionary dictionaryWithObject:self.titleStringToDisplay forKey:@"title"]; 
      self.notification.userInfo = infoDict; 

      [[UIApplication sharedApplication] scheduleLocalNotification:self.notification]; 
     } 
// I'm doing this for each day. 

NSCalendarUnitDay повторяет мое ежедневное уведомление, не имеет значения, какие дни я выбрал. Я пробовал NSCalendarUnitWeekOfYear, но мои уведомления никогда не срабатывали при использовании этого.

Цель состоит в том, чтобы пользователь задавал свое название, время и повторяющиеся дни (как и собственное приложение для аварийных сигналов).

Как установить интервал повторения для этого?

Обновление и новый выпуск:

Я использую NSCalendarUnitWeekOfYear прямо сейчас.

Вот моя проблема ... уведомление больше не срабатывает, а repeatInterval всегда устанавливается на понедельник, а не на день недели, который он выполняет в коде.

ответ

0

Существует несколько способов сделать это. Вы можете использовать NScalender, чтобы найти день недели, и вычислить ту дату, на которую вы хотите получать уведомления.

-(void) calculateweeknumber 
{ 

    NSCalendar *numberCalendar = [NSCalendar currentCalendar]; 
    NSDateComponents *comps = [numberCalendar components:NSWeekdayCalendarUnit fromDate:[NSDate date]]; 
    [comps setSecond:0.0]; 
    weekday = [comps weekday]; 
    NSLog(@"number is %d",weekday); 
} 
+0

В этом случае, что такое будний день? –

+0

будний день - текущий день календаря, как сегодня - пятница, поэтому будний день пятницы - 6 @LukeIrvin – salmancs43

+0

Gotcha. Итак, вот моя проблема с моим кодом выше. Все мои повторы бьются каждый понедельник, хотя, когда я просматриваю свой код, он проходит через дни недели, на которые я его устанавливал. –

0

У вашего кода много проблем.

Ваша дата исходит из UIDatePicker очевидно. Вы должны использовать эту дату. Преобразование его вперед и назад - это вздор.

Кроме того, избавиться от всего дублированного кода. Это затрудняет понимание (и исправление) кода. Это скрывает логику.

Настоящая проблема заключается в том, что вы только что установили компоненты даты, как если бы это была дата. Это не. Вы начинаете с какой-то даты, брошенной в компоненты, а затем устанавливаете рабочий день. Это не даст другой допустимой даты - почему? Как это могло быть? Что нужно настроить? День? Месяц? Год? В будущее или в прошлое? Кажется, что день недели просто игнорируется при переходе на дату.

Вам необходимо рассчитать правильную дату (this answer описывает расчет следующего понедельника).