How to fix EKErrorDomain Code=1 "No calendar has been set

冷暖自知 提交于 2019-12-04 03:20:07

问题


I want to create a calendar entry to the iPhone calendar, I have tried the following code

        EKEventStore *eventStore = [[EKEventStore alloc] init];
        EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
        event.title     = self.selectedPost.postTitle;
        event.notes     = self.selectedPost.postContent;
        event.startDate =  self.selectedPost.startDate;
        event.endDate   =  self.selectedPost.endDate;

        EKCalendar *targetCalendar = nil;
        targetCalendar = [eventStore defaultCalendarForNewEvents];
        NSLog(@"%@",targetCalendar);
        [event setCalendar:targetCalendar];
        NSError *err;
        [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
        UIAlertView *alert = nil;
        NSLog(@"err %@",err);
        if (err) {
            alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[err localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
        }
        else{
            alert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Added to calender" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
        }

        [alert show];

but result is

2013-01-15 22:31:34.682 Project[40863:907] defaultCalendarForNewEvents failed: Error Domain=EKCADErrorDomain Code=1013 "The operation couldn’t be completed. (EKCADErrorDomain error 1013.)"
2013-01-15 22:31:34.683 Project[40863:907] (null)
2013-01-15 22:31:34.690 Project[40863:907] err Error Domain=EKErrorDomain Code=1 "No calendar has been set." UserInfo=0x1d535ba0 {NSLocalizedDescription=No calendar has been set.}

I know this is because of

[eventStore defaultCalendarForNewEvents];

returns null. I have tried [eventStore calendarWithIdentifier:event.calendarItemIdentifier]; and some other code but same result how to fix this Any idea


回答1:


If this is on iOS 6.0 or later, you'll have to first request access to the user's calendars before EventKit will hand them to you by using the method -[EKEventStore requestAccessToEntityType:completion:]

Check out the example given in the Calendar and Reminders Programming Guide




回答2:


For the sake of not-wasting-your-time just make sure, that you are using the bit masks in -[EKEventStore requestAccessToEntityType:completion:]

like this

EKEventStore *eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityMaskEvent completion:^(BOOL granted, NSError *error) {
    // ...
}];



回答3:


I fixed it by making sure that the title wasn't the same as the one that i was creating, for example I have dance on several nights so for one night i would do Dance and the other one with a period at the beginning .Dance.




回答4:


Add those lines

if(eventStore.defaultCalendarForNewEvents==nil)
*eventStore = [[EKEventStore alloc] init];

Second line will execute only first time when you grant access

Your code should look like this below

    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
    event.title     = self.selectedPost.postTitle;
    event.notes     = self.selectedPost.postContent;
    event.startDate =  self.selectedPost.startDate;
    event.endDate   =  self.selectedPost.endDate;

    EKCalendar *targetCalendar = nil;
   if(eventStore.defaultCalendarForNewEvents==nil)
      *eventStore = [[EKEventStore alloc] init];
    targetCalendar = [eventStore defaultCalendarForNewEvents];
    NSLog(@"%@",targetCalendar);
    [event setCalendar:targetCalendar];
    NSError *err;
    [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
    UIAlertView *alert = nil;
    NSLog(@"err %@",err);
    if (err) {
        alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[err localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    }
    else{
        alert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Added to calender" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    }

    [alert show];

this works for me



来源:https://stackoverflow.com/questions/14343081/how-to-fix-ekerrordomain-code-1-no-calendar-has-been-set

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!