Thursday, March 8, 2012

How can I programmatically create an iCal event in the default calendar?


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.


1 comment:

  1. 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.

    ReplyDelete