iOS: запрос компонентов даты - PullRequest
2 голосов
/ 23 января 2012

Мне было интересно, как бы я отредактировал dateComps setDay:, чтобы он срабатывал за 3 дня до даты, установленной в сборщике. Я набрал -3, но, похоже, это не сработало. Любая помощь высоко ценится! Вот мой код:

- (IBAction)scheduleNotifButton:(id)sender {
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

    NSDate *pickerDate = [self.datePicker date];

    NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit )
                                                   fromDate:pickerDate];
    NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
                                                   fromDate:pickerDate];

    NSDateComponents *dateComps = [[NSDateComponents alloc] init];
    [dateComps setDay:[dateComponents day]];
    [dateComps setMonth:[dateComponents month]];
    [dateComps setYear:[dateComponents year]];
    [dateComps setHour:13];
    [dateComps setMinute:30];
    [dateComps setSecond:[timeComponents second]];
    NSDate *itemDate = [calendar dateFromComponents:dateComps];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = @"Event is in 3 days!";
    localNotif.alertAction = nil;

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 0;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

}

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Я думаю, все, что вам нужно сделать, это вычесть 3 дня из даты, возвращенной средством выбора даты, нет?

NSDate *pickerDate = [self.datePicker date]
pickerDate = [ pickerDate dateByAddingTimeInterval:-3 * 24 * 60 * 60 ] ; // add this line

Версия с использованием компонентов даты:

- (IBAction)scheduleNotifButton:(id)sender {
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

    NSDate *pickerDate = [self.datePicker date];

    {
        NSDateComponent * deltaComponents = [ [ NSDateComponents alloc ] init ];
        deltaComponents.days = -3 ;

        pickerDate = [ pickerDate dateByAddingComponents:deltaComponents ] ;
    }

    NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) fromDate:pickerDate];

    [dateComps setHour:13];
    [dateComps setMinute:30];

    NSDate *itemDate = [calendar dateFromComponents:dateComps];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = @"Event is in 3 days!";
    localNotif.alertAction = nil;

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 0;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

}
2 голосов
/ 23 января 2012

Когда вы говорите, что набрали -3, вы имеете в виду, что использовали эту строку?

[dateComps setDay:[dateComponents day] - 3];

Это на самом деле должно работать.

Кроме того, вы можете указать системе запускать любой следующий год, просто установив текущий год для компонентов даты. Вы можете найти текущий год так же, как вы нашли компоненты даты для pickerDate.

После этого вы можете установить repeatInterval локального уведомления на NSYearCalendarUnit, чтобы оно срабатывало каждый год.

1 голос
/ 23 января 2012

Использование dateByAddingComponents:toDate:options:

// ...
NSDateComponents *offset = [NSDateComponents new];
[offset setDay:(-3)];
NSDate *date3DaysBefore = [calendar dateByAddingComponents:offset toDate:pickerDate options:0];
// ...
1 голос
/ 23 января 2012

Вот код для вычитания 3 дней из сегодняшнего дня (СЕЙЧАС).Вы можете адаптировать его под свои нужды:

   NSDate *today = [NSDate date];
    NSLog(@"NOW:%@",today);
    NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *todayComps = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:today];
     todayComps.day -=3;
    NSDate *dateMinus3Days = [gregorian dateFromComponents:todayComps];
    NSLog(@"3 days before NOW:%@",dateMinus3Days);

Вы делаете это слишком сложно.Компоненты DateComponents можно изменить, а затем установить новую дату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...