4

繰り返しルール RRULE:FREQ=YEARLY;BYMONTH=6,7;BYDAY=1TH を使用してカレンダーにイベントを追加しようとしています。

したがって、このルールに従って、プロジェクトで設定した有効期限まで、6 月と 7 月の各第 1 木曜日にイベントを毎年追加する必要があります。

私のプロジェクトでは、イベントは作成されますが、繰り返しルールに従っていません。次のコードでは、6 月の第 1 木曜日にのみイベントが追加されます。毎年 7 月の第 1 木曜日にもイベントが追加されないのはなぜですか?

ここに.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];
}

誰かがこれに関して私を助けてくれますか?

4

2 に答える 2

1

これは別の質問の繰り返しのようです。基本的に、「BYDAY」ルールによると、YEARLY 頻度の第 1 は、毎月第 1 週ではなく、年の第 1 週を意味します。

@Shuvo、rfcを読んでいませんでした。しかし、ここに Apple ドキュメントEKRecurrenceDayOfWeekがあります。

EKRecurrenceDayOfWeek クラスは、EKRecurrenceRule オブジェクトで使用する曜日を表します。曜日には、繰り返しルールの頻度で特定の日を示す週番号をオプションで付けることができます。たとえば、曜日の値が火曜日で週番号が 2 の曜日は、毎月の繰り返しルールでは毎月第 2 火曜日を表し、毎年の繰り返しルールでは毎年第 2 火曜日を表します。

「第 1 木曜日」と言うとき、それは正しいです - 年次のコンテキストを除いて、それは年の第 1 木曜日です。

于 2013-09-07T04:38:59.930 に答える