2012-10-03 75 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 

,你會創建一個新的日曆和新的事件添加到它