如何以编程方式在默认日历中创建 iCal 事件?

发布于 2024-09-13 08:18:46 字数 69 浏览 4 评论 0原文

如何使用 Objective-C 以编程方式在默认日历中创建 iCal 事件?我想检查事件是否已经存在并相应地设置按钮状态。

How can I use Objective-C to programmatically create an iCal event in the default calendar? I want to check whether the event already exists and set the button state accordingly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷夜 2024-09-20 08:18:46

有关如何使用 Objective-C 以编程方式在默认日历中创建 iCAL 事件的示例。该代码检查事件是否已存在,并相应地设置按钮状态。这是 @codeburger 的代码:

-(void)initCalendar {

 // An array of 1 dictionary object, containing START and END values.
 NSMutableArray* pvDict  = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:PV_URL ]];

 // Check if the private view event already exists in the default calendar.
 // Then set the calendar button state.

 // Get a entry point to the Calendar database.
 self.store = [[EKEventStore alloc ] init ];

 // Get an array of all the calendars.
 NSArray *calendars = store.calendars;

 // Get the default calendar, set by the user in preferences.
 EKCalendar *defaultCal = store.defaultCalendarForNewEvents;

 // Find out if this calendar is modifiable.
  BOOL isDefaultCalModifiable = defaultCal.allowsContentModifications ;

 // Create an event in the default calendar.

  self.event = [ EKEvent eventWithEventStore:store ];

 self.event.title = CHELSEA_SPACE ;
 self.event.location = CHELSEA_ADDRESS ;

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
 [dateFormatter setDateFormat:@"yyy-MM-dd HH:mm:ss.S"];

 NSString *startString = [[ pvDict objectAtIndex:0] objectForKey:@"starts" ];
 NSDate *dateStart = [dateFormatter dateFromString:startString];

 NSString *endString = [[ pvDict objectAtIndex:0] objectForKey:@"ends" ];
 NSDate *dateEnd = [dateFormatter dateFromString:endString];

    self.event.startDate = dateStart;
 self.event.endDate   = dateEnd; 

 self.event.calendar = defaultCal ;

 // Alternative code to add 2.5 hours to start time.
 // [[NSDate alloc] initWithTimeInterval:9000 sinceDate:event.startDate];

 // Search for events which match this date/time start and end.
 // Compare the matched events by event TITLE.

 NSPredicate *predicate = [store predicateForEventsWithStartDate:event.startDate 
           endDate:event.endDate calendars:calendars];

 NSArray *matchingEvents = [store eventsMatchingPredicate:predicate];

 self.calendarButton.enabled = NO;

 if( ! isDefaultCalModifiable ) {
  // The default calendar is not modifiable
  return ;
 } 

 if ( [ matchingEvents count ] > 0 ) {

  // There are already event(s) which match this date/time start and end.
   // Check if this event is the PV

  EKEvent *anEvent;  
  int j;

  for ( j=0; j < [ matchingEvents count]; j++) {

   anEvent = [ matchingEvents objectAtIndex:j ] ;
   if([ CHELSEA_SPACE isEqualToString: anEvent.title ]) {
    // PV event already exists in calendar.
    return;
   }
  }
  [ anEvent release ];
 }

 self.calendarButton.enabled = YES;

 [ pvDict release ];
}

-(void)addEventToCalendar:(id)sender {

 NSError *error;
 BOOL saved = [self.store saveEvent:self.event span:EKSpanThisEvent error:&error]; 

 NSLog(@"Saved calendar event = %@\n", (saved ? @"YES" : @"NO"));
 self.calendarButton.enabled = NO;

}

我看到这个问题没有答案,觉得应该对其进行编辑,给出完整的答案感谢@codeburger

An example of how to programmatically create an iCAL event in the default calendar, using Objective-C. The code checks if the event already exists, and sets the button state accordingly. Here is the code by @codeburger:

-(void)initCalendar {

 // An array of 1 dictionary object, containing START and END values.
 NSMutableArray* pvDict  = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:PV_URL ]];

 // Check if the private view event already exists in the default calendar.
 // Then set the calendar button state.

 // Get a entry point to the Calendar database.
 self.store = [[EKEventStore alloc ] init ];

 // Get an array of all the calendars.
 NSArray *calendars = store.calendars;

 // Get the default calendar, set by the user in preferences.
 EKCalendar *defaultCal = store.defaultCalendarForNewEvents;

 // Find out if this calendar is modifiable.
  BOOL isDefaultCalModifiable = defaultCal.allowsContentModifications ;

 // Create an event in the default calendar.

  self.event = [ EKEvent eventWithEventStore:store ];

 self.event.title = CHELSEA_SPACE ;
 self.event.location = CHELSEA_ADDRESS ;

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
 [dateFormatter setDateFormat:@"yyy-MM-dd HH:mm:ss.S"];

 NSString *startString = [[ pvDict objectAtIndex:0] objectForKey:@"starts" ];
 NSDate *dateStart = [dateFormatter dateFromString:startString];

 NSString *endString = [[ pvDict objectAtIndex:0] objectForKey:@"ends" ];
 NSDate *dateEnd = [dateFormatter dateFromString:endString];

    self.event.startDate = dateStart;
 self.event.endDate   = dateEnd; 

 self.event.calendar = defaultCal ;

 // Alternative code to add 2.5 hours to start time.
 // [[NSDate alloc] initWithTimeInterval:9000 sinceDate:event.startDate];

 // Search for events which match this date/time start and end.
 // Compare the matched events by event TITLE.

 NSPredicate *predicate = [store predicateForEventsWithStartDate:event.startDate 
           endDate:event.endDate calendars:calendars];

 NSArray *matchingEvents = [store eventsMatchingPredicate:predicate];

 self.calendarButton.enabled = NO;

 if( ! isDefaultCalModifiable ) {
  // The default calendar is not modifiable
  return ;
 } 

 if ( [ matchingEvents count ] > 0 ) {

  // There are already event(s) which match this date/time start and end.
   // Check if this event is the PV

  EKEvent *anEvent;  
  int j;

  for ( j=0; j < [ matchingEvents count]; j++) {

   anEvent = [ matchingEvents objectAtIndex:j ] ;
   if([ CHELSEA_SPACE isEqualToString: anEvent.title ]) {
    // PV event already exists in calendar.
    return;
   }
  }
  [ anEvent release ];
 }

 self.calendarButton.enabled = YES;

 [ pvDict release ];
}

-(void)addEventToCalendar:(id)sender {

 NSError *error;
 BOOL saved = [self.store saveEvent:self.event span:EKSpanThisEvent error:&error]; 

 NSLog(@"Saved calendar event = %@\n", (saved ? @"YES" : @"NO"));
 self.calendarButton.enabled = NO;

}

I've seen this question with no answer and felt like it should be edited giving full credit to @codeburger.

你是年少的欢喜 2024-09-20 08:18:46
 EKEventStore *eventStore = [[EKEventStore alloc] init];

 EKEvent *event = [EKEvent eventWithEventStore:eventStore];
 NSDate *date = [[NSDate alloc ]init];//today,s date
 event.title = @"remainder";//title for your remainder

 event.startDate=date;//start time of your remainder
 event.endDate = [[NSDate alloc] initWithTimeInterval:1800 sinceDate:event.startDate];//end time of your remainder

 NSTimeInterval interval = (60 *60)* -3 ;
 EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:interval]; //Create object of alarm

 [event addAlarm:alarm]; //Add alarm to your event

 [event setCalendar:[eventStore defaultCalendarForNewEvents]];
  NSError *err;
  NSString *ical_event_id;
  //save your event
 if([eventStore saveEvent:event span:EKSpanThisEvent error:&err]){
        ical_event_id = event.eventIdentifier;
        NSLog(@"%@",ical_event_id);
 }

 for more info check this link

EKEvent 示例< /a>

 EKEventStore *eventStore = [[EKEventStore alloc] init];

 EKEvent *event = [EKEvent eventWithEventStore:eventStore];
 NSDate *date = [[NSDate alloc ]init];//today,s date
 event.title = @"remainder";//title for your remainder

 event.startDate=date;//start time of your remainder
 event.endDate = [[NSDate alloc] initWithTimeInterval:1800 sinceDate:event.startDate];//end time of your remainder

 NSTimeInterval interval = (60 *60)* -3 ;
 EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:interval]; //Create object of alarm

 [event addAlarm:alarm]; //Add alarm to your event

 [event setCalendar:[eventStore defaultCalendarForNewEvents]];
  NSError *err;
  NSString *ical_event_id;
  //save your event
 if([eventStore saveEvent:event span:EKSpanThisEvent error:&err]){
        ical_event_id = event.eventIdentifier;
        NSLog(@"%@",ical_event_id);
 }

 for more info check this link

sample for EKEvent

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文