首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS EKEventStore不保存日历

iOS EKEventStore不保存日历
EN

Stack Overflow用户
提问于 2012-10-04 00:26:02
回答 3查看 5.1K关注 0票数 1

我似乎不明白为什么下面的代码不能工作。我得到了"Calendar Created“和"Calendar Existed”的NSlogs,我也没有问题地得到Calendar ID。我有一堆(大概10个)创建的日历只是在某个时刻“出现”,但我一直在尝试删除它们,它们没有显示出来。我真的很困惑为什么它不能工作。

代码语言:javascript
复制
-(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");
            }

        }];
    } }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-04 01:13:48

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

票数 0
EN

Stack Overflow用户

发布于 2013-04-17 16:19:43

我认为如果用户删除了一个日历,你不需要在设置下有一个“重置日历”按钮。只需将代码行从:

代码语言:javascript
复制
if ([defaults objectForKey:@"Calendar"] == nil) // Create Calendar if Needed

代码语言:javascript
复制
if ([defaults objectForKey:@"Calendar"] == nil || ![eventStore calendarWithIdentifier:[defaults objectForKey:@"Calendar"]]) // Create Calendar if Needed

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

票数 2
EN

Stack Overflow用户

发布于 2012-10-30 21:43:42

问题出在代码的第一行。

代码语言:javascript
复制
//Wrong Way..
EKEventStore *eventStore = [[EKEventStore alloc] init];

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

这里不是"alloc init“,而是从管理日历数据源的类中获取EKEventStore实例。这可能看起来像。

代码语言:javascript
复制
EKEventStore *eventStore = [dataSource getEventSore];

此外,我建议您跟踪EKEvent的标识符,而不是跟踪日历的ID。

代码语言:javascript
复制
EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
NSLog(@"eventIdentifier = %@",event.eventIdentifier);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12712759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档