iPhone Event Kit:以编程方式创建EKCalendar?

时间:2010-10-13 13:23:38

标签: iphone

我想在我的应用中插入事件,因此可以在iPhone Calendar.app中查看它们。但由于我不想将用户事件与我的应用程序中的用户事件混合,我想创建一个类似“MyApp Events”的EKCalendar

这可能吗?你会如何过滤你的活动呢?

谢谢!

3 个答案:

答案 0 :(得分:12)

绝对可以创建自己的日历 - 问题是您需要iOS 5:

EKEventStore* eventStore = [[EKEventStore alloc] init];
NSString* calendarName = @"My Cal";
EKCalendar* calendar;

// Get the calendar source
EKSource* localSource;
for (EKSource* source in eventStore.sources) {
    if (source.sourceType == EKSourceTypeLocal)
    {
        localSource = source;
        break;
    }
}

if (!localSource)
    return;

calendar = [EKCalendar calendarWithEventStore:eventStore];
calendar.source = localSource;
calendar.title = calendarName;

NSError* error;
bool success= [eventStore saveCalendar:calendar commit:YES error:&error];
if (error != nil)
{
    NSLog(error.description);
    // TODO: error handling here
}

答案 1 :(得分:2)

您(或其他任何人)是否在添加新日历方面取得了进展?

我遇到了同样的情况。我可以通过编程方式将事件很好地添加到默认日历中,但我想将它们添加到新日历中,这样它们就不会干扰用户存在的事件,并且可以被用户轻松删除/隐藏而不是删除所有事件都是手动的。

您无法设置新EKCalendar对象的属性。看起来你只能将一个像defaultCalendarForNewEvents这样的现有的东西分配给一个EKCalendar对象。

但是,我知道可以以编程方式创建一个新日历,因为我已经看到iPhone应用程序正在执行此操作(不离开应用程序)。

  • 可能是因为他们使用外部ICS文件做了一些技巧吗?
  • 也许可以通过“订阅”本地(在iPhone / app文件系统上)生成的ICS文件而不是URL来实现。有没有人有这方面的经验?

答案 2 :(得分:0)

这是您可以查看具有特定标题的日历是否已存在的方法。 如果它不存在,那么您可以以编程方式创建它。

声明布尔类型变量

BOOL doesExist=NO;
  EKEventStore *eventStore=[[EKEventStore alloc] init];

  NSArray *calanders=[eventStore   calendarsForEntityType:EKEntityTypeEvent];

  //Now Iterate through every calendar in the array and match its title  
  // with the title that you want to create



 for(EKCalendar calendar in calendars)
   {
         if([[calendar title] isEqualToString:@"youdesiredname"])
          {
                   doesExist=YES; 
          }

   }

//所以现在检查我们的bool变量是否包含值YES它意味着已经存在具有相同名称/标题的日历。如果没有则可以创建

 if(!doesExist)
    {
        NSString* calendarName = @"DesiredCalendarName";
        EKCalendar* calendar;


       EKSource* localSource;
       for (EKSource* source in eventStore.sources) {
       if (source.sourceType == EKSourceTypeLocal)
       {
        localSource = source;
        break;
       }




    if (!localSource)
        return;

       calendar = [EKCalendar calendarWithEventStore:eventStore];
       calendar.source = localSource;
       calendar.title = calendarName;


       EKEvent *event = [EKEvent eventWithEventStore:eventStore];
       calendar = [eventStore calendarWithIdentifier:self.calendarIdentifier];
       event.calendar = calendar;

      // Set the start date to the current date/time and the event duration to one hour
      NSDate *startDate = [NSDate date];
      event.startDate = startDate;
      event.endDate = [startDate dateByAddingTimeInterval:3600];

      //And to save the event to the event database:

       NSError *error = nil;
     BOOL result = [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
    if (result) 
    {
    NSLog(@"Saved event to event store.")
    } 
   else 
    {
     NSLog(@"Error saving event: %@.", saveError);
    }

      NSError* error;
      bool success= [eventStore saveCalendar:calendar commit:YES error:&error];
      if (error != nil)
      {
        NSLog(error.description);

      }

    }