2013-08-21 43 views
3

我试图将事件添加到日历复发规则RRULE没有添加:= YEARLY FREQ; BYMONTH = 6,7; BYDAY = [帖EKEvent根据给定EKRecurrenceRule

所以根据这个规则事件应该每年添加一次,每个6月1日星期四和7月直到到期日期,这是我在我的项目中设置的。

在我的项目中,创建事件,但不是根据重复规则。通过以下代码,活动仅在每年的6月1日星期四添加。为什么这些事件不会在每个7月的第一个星期四增加?

这里是.m文件代码

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    [self createEvent]; 
} 

- (void)createEvent 
{ 
    EKEventStore *eventStore = [[EKEventStore alloc] init]; 
    EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 
    event.title = @"testRecurrenceRule"; 
    event.location = @"Dhaka"; 
    [event setCalendar:[eventStore defaultCalendarForNewEvents]]; 
    event.startDate = [self dateFromString:@"2013-06-18T21:00:00+06:00"]; 
    event.endDate = [self dateFromString:@"2013-06-18T22:00:00+06:00"]; 

    id recurrenceRule = [self recurrenceRuleForEvent]; 
    if(recurrenceRule != nil) 
     [event addRecurrenceRule:recurrenceRule]; 

    if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) 
    { 
     // iOS 6 and later 
     [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
      if (granted) 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        [self saveTheEvent:event eventStore:eventStore]; 
        //[eventStore saveEvent:event span:EKSpanThisEvent error:error]; 
       }); 
      } 
      else 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 

        //do nothing 
       }); 
      } 
     }]; 
    } 
    else 
    { 
     [self saveTheEvent:event eventStore:eventStore]; 
    } 

    textView.text = [NSString stringWithFormat:@"Event has been added with recurrence rule %@",recurrenceRule]; 
} 

- (void)saveTheEvent:(EKEvent *)aEvent eventStore:(EKEventStore *)aStore 
{ 
    [aStore saveEvent:aEvent span:EKSpanThisEvent error:NULL]; 
} 

- (EKRecurrenceRule *)recurrenceRuleForEvent 
{ 
    //just creating a recurrence rule for RRULE:FREQ=YEARLY;BYMONTH=6,7;BYDAY=1TH 
    // setting the values directly for testing purpose. 

    //FREQ=YEARLY 
    EKRecurrenceFrequency recurrenceFrequency = EKRecurrenceFrequencyYearly; 
    NSInteger recurrenceInterval = 1;            
    EKRecurrenceEnd *endRecurrence = nil;           
    NSMutableArray *monthsOfTheYearArray = [NSMutableArray array];    
    NSMutableArray *daysOfTheWeekArray = [NSMutableArray array];     
    NSMutableArray *daysOfTheMonthArray = [NSMutableArray array];    
    NSMutableArray *weeksOfTheYearArray = [NSMutableArray array];    
    NSMutableArray *daysOfTheYearArray = [NSMutableArray array];   
    NSMutableArray *setPositionsArray = [NSMutableArray array];   

    //BYMONTH=6,7 
    [monthsOfTheYearArray addObject:[NSNumber numberWithInt:6]]; 
    [monthsOfTheYearArray addObject:[NSNumber numberWithInt:7]]; 

    //BYDAY=1TH 
    [daysOfTheWeekArray addObject:[EKRecurrenceDayOfWeek dayOfWeek:5 weekNumber:1]]; 

    endRecurrence = [EKRecurrenceEnd recurrenceEndWithEndDate:[self dateFromString:@"2018-12-15T22:30+06:00"]]; 

    EKRecurrenceRule *recurrence = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:recurrenceFrequency 
                       interval:recurrenceInterval 
                      daysOfTheWeek:daysOfTheWeekArray 
                      daysOfTheMonth:daysOfTheMonthArray 
                     monthsOfTheYear:monthsOfTheYearArray 
                      weeksOfTheYear:weeksOfTheYearArray 
                      daysOfTheYear:daysOfTheYearArray 
                      setPositions:setPositionsArray 
                        end:endRecurrence]; 
    return recurrence; 
} 

- (NSDate *)dateFromString:(NSString *)string 
{ 
    //check if the date string in null 
    if ([string length] == 0) 
     return nil; 

    NSString *dateString = nil; 
    NSString *modifiedString = nil; 
    BOOL secSpotMissing = false; 

    NSRange range = [string rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"T"]]; 
    if (range.location != NSNotFound) 
    { 
     dateString = [string substringFromIndex:range.location]; 

     range = [dateString rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"+-Z"]]; 
     if (range.location != NSNotFound) 
     { 
      //seperate the time portion of date string and checking second field is missing or not. like is it HH:mm or HH:mm:ss? 
      if ([[[dateString substringToIndex:range.location] componentsSeparatedByString:@":"] count] < 3) 
       secSpotMissing = true; 

      //seperate the time zone portion and checking is there any extra ':' on it. It should like -0600 not -06:00. If it has that extra ':', just replacing it here. 
      dateString = [dateString substringFromIndex:range.location]; 
      if([dateString hasSuffix:@"Z"]) 
       modifiedString = [dateString stringByReplacingOccurrencesOfString:@"Z" withString:@"+0000"]; 
      else 
       modifiedString = [dateString stringByReplacingOccurrencesOfString:@":" withString:@""]; 
      string = [string stringByReplacingOccurrencesOfString:dateString withString:modifiedString]; 
     } 
    } 
    else 
     return nil; 

    // converting the date string according to it's format. 
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
    if (secSpotMissing) 
     [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mmZZZ"]; 
    else 
     [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
    return [dateFormatter dateFromString:string]; 
} 

有人可以帮我对此?

+0

请更具体 - 当创建事件时?另外,在这里包含_relevant_代码,而不是链接到现场。 –

+0

我正在尝试使用重复规则添加事件。但是事件重复根据重复规则不起作用。对我来说这很奇怪,可能是我想念一些东西。这就是我添加项目链接的原因。 – shuvo

+0

@shuvo与此有关的任何消息?我跑了多个测试,看起来'monthsOfTheYear'被简单地忽略了。另外,当从'EventKit'读取时,'monthsOfTheYear'总是零,即使在2个不同的月份创建了事件(从mac osx日历创建) –

回答

1

这似乎是另一个问题的重复。基本上,根据“BYDAY”规则,年度第一频率意味着一年中的第一周 - 而不是每个月的第一周。

@Shuvo,我没有阅读rfc。但这里是Apple文档EKRecurrenceDayOfWeek

EKRecurrenceDayOfWeek类表示用于EKRecurrenceRule对象的星期几。一周中的某天可以有一个星期的数字,表示重复规则的频率中的特定日期。例如,星期几值为星期二,星期数为2的星期几将表示每月重复规则中每月的第二个星期二以及每年重复规则中每年的第二个星期二。

当你说“第一个星期四”时,这是正确的 - 除了在每年的情况下,它是今年的第一个星期四。

+0

我觉得你误解了,经常性的规则是关于互联网日历和调度核心对象规范,请阅读这个http://www.ietf.org/rfc/rfc2445.txt链接了解更多细节,1TH表示每周一的第一个星期四。 – shuvo

0

这个错误得到了Apple的证实,至少在iOS 7.1.3(这是目前最新版本)之前。