EKRecurrenceRule - добавлять повторяющиеся события, но исключать выходные - PullRequest
0 голосов
/ 13 марта 2012

У меня есть этот метод, который добавляет события в собственный календарь iphone.Уже успешно добавляются ежемесячные напоминания, но я хочу, чтобы любые ежемесячные напоминания приходились на дни недели (не выходные).

Модель NSDictionary просто Id: Start_Date__c Finish_Date__c Payment_Interval__c = Monthly

- (void)addRecurringEventsForPartnership:(NSDictionary *)dict{
    ENTER_METHOD;

    NSError *error = nil;
    EKEvent *startEvent  = [EKEvent eventWithEventStore:self.eventStore];
    startEvent.calendar = self.defaultCalendar;
     startEvent.availability = EKEventAvailabilityFree;
    startEvent.startDate = [NSDate dateWithLongFormatString:[dict valueForKey:@"Start_Date__c"]];
    startEvent.allDay = YES;
   // startEvent.endDate =  [startEvent.startDate dateByAddingTimeInterval:30*60];
     startEvent.title = [dict theNameValue];
    ///4853702/xcode-pochemu-moe-sobytie-ne-dobavlyaetsya-v-kalendar
    if ([startEvent.startDate isEqualToDate:startEvent.endDate]) {
        startEvent.endDate = [startEvent.startDate dateByAddingTimeInterval:30*60];;
    }

   // if 
    if ([[dict valueForKey:@"Payment_Interval__c"] isEqualToString:@"Monthly"]) {
        EKRecurrenceFrequency freq = EKRecurrenceFrequencyMonthly;
        int recurrenceInterval = 1;

        EKRecurrenceRule *rule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:freq interval:recurrenceInterval end:nil];
        startEvent.recurrenceRule = rule;

        startEvent.notes = [NSString stringWithFormat:@"Id:%@",[dict valueForKey:@"Id"]];
        // [self.eventStore removeEvent:startEvent span:EKSpanThisEvent error:&error];
        [self.eventStore saveEvent:startEvent span:EKSpanThisEvent error:&error];

        if (error != nil)
        {
            DLog(@"WARNING:%@",error.description);
            // TODO: error handling here
        }
    }



  //  DLog(@"startEvent.endDate:%@",startEvent.endDate);


    EKEvent *finishEvent  = [EKEvent eventWithEventStore:self.eventStore];
    finishEvent.calendar = self.defaultCalendar;
    finishEvent.availability = EKEventAvailabilityFree;
    finishEvent.startDate = [NSDate dateWithLongFormatString:[dict valueForKey:@"Finish_Date__c"]];
    finishEvent.allDay = YES;
    finishEvent.title = [NSString stringWithFormat:@"%@ - Finish",[dict theNameValue]];


    finishEvent.notes = [NSString stringWithFormat:@"Id:%@",[dict valueForKey:@"Id"]];
    [self.eventStore saveEvent:finishEvent span:EKSpanThisEvent error:&error];

    if (error != nil)
    {
        DLog(@"WARNING:%@",error.description);
        // TODO: error handling here
    }

}

Ответы [ 2 ]

1 голос
/ 22 января 2014

Вот что работает (по крайней мере, в iOS7, не тестировалось на других системах):

EKRecurrenceRule *er = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyMonthly interval:1
                                                                   daysOfTheWeek:@[[EKRecurrenceDayOfWeek dayOfWeek:2], // Monday
                                                                                   [EKRecurrenceDayOfWeek dayOfWeek:3], // Tuesday
                                                                                   [EKRecurrenceDayOfWeek dayOfWeek:4], // Wednesday
                                                                                   [EKRecurrenceDayOfWeek dayOfWeek:5], // Thursday
                                                                                   [EKRecurrenceDayOfWeek dayOfWeek:6]] // Friday
                                                                  daysOfTheMonth:@[@1, @2]
                                                                 monthsOfTheYear:nil weeksOfTheYear:nil daysOfTheYear:nil setPositions:nil end:nil];
event.recurrenceRules = @[er];
1 голос
/ 13 марта 2012

Не могли бы вы использовать NSDateFormatter, чтобы получить числовой день недели, а затем скорректировать, вычитая или добавляя 1 или 2 в зависимости от того, какой день он возвратил?

[dateFormatter setDateFormat:@"c"];

Вернет числовой (1-7) день недели я считаю

...