2012-10-03 48 views
1

我似乎无法弄清楚为什么下面的代码不工作。我得到了“创建日历”和“日历已存在”的NSlog,我也可以获得没有问题的日历ID。我有一堆(如10)的创建日历只是“出现”在一点,但我删除了他们所有不断尝试,他们没有显示出来。我很困惑,为什么它不起作用。iOS EKEventStore不保存日历

-(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"); 
      } 

     }]; 
    } } 

回答

0

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

+0

可以请你为“重置日历”行动提供的代码块? –

+0

这里我的代码是一样的东西: FUNC resetCalendar(){ 做{ self.eventStore.reset() 试self.eventStore.commit() } 赶上{ 打印(”错误正在重置日历== = >> \(error)“) showErrorMessageAlertView(error as NSError,viewdelegate:nil) } self.eventStore.refreshSourcesIfNecessary() } –

1

问题出在代码的第一行。

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

您已经创建了另一个EKEventStore实例,并且您想在现有实例中执行事务。

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

EKEventStore *eventStore = [dataSource getEventSore]; 

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

EKEvent *event = [EKEvent eventWithEventStore:eventStore]; 
NSLog(@"eventIdentifier = %@",event.eventIdentifier); 
2

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

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

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

,你会创建一个新的日历和新的事件添加到它