1

我似乎无法弄清楚为什么以下代码不起作用。我获得了“日历已创建”和“日历已存在”的 NSlogs 我也毫无问题地获得了日历 ID。我有一堆(比如 10 个)创建的日历只是“出现”一次,但我一直在尝试删除它们,但它们没有出现。我真的很困惑为什么它不起作用。

-(void)saveEventWithDate:(NSDate *)startDate endDate:(NSDate *)endDate {
    AppData *theData = [self theAppData];

    EKEventStore *eventStore = [[EKEventStore alloc] init];

    if([self checkIsDeviceVersionHigherThanRequiredVersion:@"6.0"]) {
        [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

            if (granted){

                EKEvent *event  = [EKEvent eventWithEventStore:eventStore];

                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

                if ([defaults objectForKey:@"Calendar"] == nil) // Create Calendar if Needed
                {
                    EKSource *theSource = nil;

                    for (EKSource *source in eventStore.sources) {
                        if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"]) {
                            theSource = source;
                            NSLog(@"iCloud Store Source");
                            break;
                        } else {
                            for (EKSource *source in eventStore.sources) {
                                if (source.sourceType == EKSourceTypeLocal) {
                                    theSource = source;
                                    NSLog(@"iPhone Local Store Source");
                                    break;
                                }
                            }
                        }
                    }

                    EKCalendar *cal;
                    cal = [EKCalendar calendarWithEventStore:eventStore];
                    cal.title = @"hello";
                    cal.source = theSource;
                    [eventStore saveCalendar:cal commit:YES error:nil];
                    NSLog(@"cal id = %@", cal.calendarIdentifier);
                    NSString *calendar_id = cal.calendarIdentifier;
                    [defaults setObject:calendar_id forKey:@"Calendar"];
                    event.calendar  = cal;

                } else {
                    event.calendar  = [eventStore calendarWithIdentifier:[defaults objectForKey:@"Calendar"]];
                    NSLog(@"Calendar Existed");
                }

                event.title     = [NSString stringWithFormat:@"%@ iPhone",[theData.repair_info objectForKey:@"name"]];
                event.location  = @"Location of";
                event.notes     = @"Notes";
                event.startDate = startDate;
                event.endDate   = endDate;
                event.allDay    = NO;
                EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:-1800]; // Half Hour Before
                event.alarms = [NSArray arrayWithObject:alarm];

                [eventStore saveEvent:event span:EKSpanThisEvent error:nil];

            } else {
                NSLog(@"Not Granted");
            }

        }];
    } }
4

3 回答 3

2

如果用户删除了日历,我认为您不需要在设置下有“重置日历”按钮。只需从以下位置更改代码行:

if ([defaults objectForKey:@"Calendar"] == nil) // Create Calendar if Needed

if ([defaults objectForKey:@"Calendar"] == nil || ![eventStore calendarWithIdentifier:[defaults objectForKey:@"Calendar"]]) // Create Calendar if Needed

您将创建一个新日历并向其中添加新事件

于 2013-04-17T08:19:43.490 回答
1

问题出在代码的第一行。

//Wrong Way..
EKEventStore *eventStore = [[EKEventStore alloc] init];

您已经创建了另一个 EKEventStore 实例,并且希望在现有实例中进行事务处理。

而不是在这里“分配初始化”它,而是从管理日历数据源的类中获取您的 EKEventStore 实例。这可能看起来像。

EKEventStore *eventStore = [dataSource getEventSore];

也不是跟踪日历的 ID。我建议您跟踪 EKEvent 的标识符。

EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
NSLog(@"eventIdentifier = %@",event.eventIdentifier);
于 2012-10-30T13:43:42.023 回答
0

问题是用户默认设置为创建(然后删除)的第一个日历,因此它不会创建另一个日历。我必须清除我的 NSUserDefaults 并创建日历。因此,如果用户删除了日历,我将不得不在设置下有一个“重置日历”按钮。

于 2012-10-03T17:13:48.370 回答