0

リマインダーを保存したいのですが、StartDateComponents を設定すると、常に無効な日付コンポーネントと表示されます。値を設定するためにいくつかの方法(コメント付きのコードを見ることができます)を試みましたが、失敗しました。

EKReminder *reminder = [EKReminder reminderWithEventStore:appDelete.eventStore];

        NSCalendar *gregorian = [NSCalendar currentCalendar];//[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

        reminder.title = @"title";
        NSString *timeStr = @"20121115070800";

        NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
        [inputFormatter setCalendar:gregorian];
        [inputFormatter setDateFormat:@"yyyyMMddHHmmss"];
        [inputFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSDate *parseDate = [inputFormatter dateFromString:timeStr];

        NSDateComponents *dateComponents = [gregorian components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit )
                                                       fromDate:parseDate];
        NSDateComponents *timeComponents = [gregorian components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
                                                       fromDate:parseDate];
        NSDateComponents *dateComps = [[NSDateComponents alloc] init];
        [dateComps setDay:[dateComponents day]];
        [dateComps setMonth:[dateComponents month]];
        [dateComps setYear:[dateComponents year]];
        [dateComps setHour:[timeComponents hour]];
        // Notification will fire in one minute
        [dateComps setMinute:[timeComponents minute]];
        [dateComps setSecond:[timeComponents second]];
        [dateComps setTimeZone:[NSTimeZone localTimeZone]];

        reminder.calendar = /*[NSCalendar autoupdatingCurrentCalendar];*/[eventStore defaultCalendarForNewEvents];
        reminder.calendar = [EKCalendar calendarWithEventStore:eventStore];

        //NSDateComponents *comp = [[NSDateComponents alloc] init];
        /*comp.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        comp.year = [[timeStr substringToIndex:3] integerValue];
        comp.month = [[timeStr substringWithRange:NSMakeRange(4,2)] integerValue];
        comp.day = [[timeStr substringWithRange:NSMakeRange(6, 2)] integerValue];
        comp.hour = [[timeStr substringWithRange:NSMakeRange(8, 2)] integerValue];
        comp.minute = [[timeStr substringWithRange:NSMakeRange(10, 2)] integerValue];
        comp.second = [[timeStr substringWithRange:NSMakeRange(12, 2)] integerValue];*/

        //reminder.startDateComponents = [gregorian components:     (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit/*|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit*/) fromDate:parseDate];

        [reminder setStartDateComponents:dateComps];// this line will throw the error:Invalid date component
4

1 に答える 1

1

主な問題は次の 2 行にあるようです。

reminder.calendar = /*[NSCalendar autoupdatingCurrentCalendar];*/[eventStore defaultCalendarForNewEvents];
reminder.calendar = [EKCalendar calendarWithEventStore:eventStore];

次の行に置き換えます。

reminder.calendar = [eventStore defaultCalendarForNewReminders];   

完全を期すために少し追加した完全な作業コードを次に示します。

EKEventStore *eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityMaskEvent completion:^(BOOL granted, NSError *error) {
    if (granted)
    {
        EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];

        NSCalendar *gregorian = [NSCalendar currentCalendar];//[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

        reminder.title = @"title44433333";
        NSString *timeStr = @"20121115070800";

        NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
        [inputFormatter setCalendar:gregorian];
        [inputFormatter setDateFormat:@"yyyyMMddHHmmss"];
        [inputFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSDate *parseDate = [inputFormatter dateFromString:timeStr];

        NSDateComponents *dateComponents = [gregorian components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit )
                                                        fromDate:parseDate];
        NSDateComponents *timeComponents = [gregorian components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit )
                                                        fromDate:parseDate];
        NSDateComponents *dateComps = [[NSDateComponents alloc] init];
        [dateComps setDay:[dateComponents day]];
        [dateComps setMonth:[dateComponents month]];
        [dateComps setYear:[dateComponents year]];
        [dateComps setHour:[timeComponents hour]];
        // Notification will fire in one minute
        [dateComps setMinute:[timeComponents minute]];
        [dateComps setSecond:[timeComponents second]];
        [dateComps setTimeZone:[NSTimeZone localTimeZone]];

        reminder.calendar = [eventStore defaultCalendarForNewReminders];   //here is the replacement

        [reminder setStartDateComponents:dateComps];// this line will throw the error:Invalid date component

        NSError *error = nil;
        [eventStore saveReminder:reminder commit:YES error:&error];
        if (error) NSLog(@"error = %@", error);
    }

}];
于 2012-12-11T20:14:23.533 に答える