domingo, 29 de abril de 2012

Añadir eventos de calendario mediante programación: Event Kit

Para poder crear eventos a un calendario, lo primero que se necesita es añadir el framework EventKit.


En este caso lo vamos a hacer mediante programación, luego nos basta con él. Si quisiéramos utilizar  el view controller de Apple para crear eventos (EKEventViewController), también habría que añadir el framework EventKitUI.   Este view controller lo que nos proporciona es una ventana en la que introducir fecha desde, fecha hasta, repeticiones, etc. Pero, como ya os he dicho, en este caso no la vamos a utilizar, en su lugar vamos a suponer que hemos creado nosotros un view controller en el que introducir los datos necesarios.

Una vez añadido el EventKit, ya podemos crear un objeto de la clase EKEventStore que es la utilizada para manejar eventos del calendario del usuario. La inicialización de este tipo de objetos lleva un tiempo relativamente largo, así que lo que se suele hacer es inicializarlo cuando se arranca la aplicación , por ejemplo en el viewDidLoad, y utilizarlo repetidamente en lugar de inicializar uno nuevo cada vez que se necesite una tarea relacionada con un evento.

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

Ahora tenemos que indicar en que calendario vamos a añadir los eventos. Podríamos utilizar un calendario de los que ya tiene el usuario.

Por ejemplo el calendario por defecto:

EKCalendar *calendar = [self.eventStore  defaultCalendarForNewEvents]

O cualquier otro mediante la propiedad calendars del objeto de la clase EKEventStore.
Pero vamos a crearnos uno nuevo. Primero comprobaremos si ya existe. Buscaremos  calendars del eventStore que hemos creado anteriormente. Voy a crear un método existCalendar:, que devolverá el EKCalendar si existe o nil en caso contrario.



- (EKCalendar *)existsCalendar:(NSString *)title
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(title == %@)", title];  
    NSArray *filtered = [self.eventStore.calendars filteredArrayUsingPredicate:predicate];
    return [filtered lastObject];
}

Si nos devuelve nil el método anterior, crearemos el calendario:

EKCalendar *calendar = [EKCalendar calendarWithEventStore:self.eventStore];
calendar.title = NSLocalizedString(@"Mi calendario", @"Calendar's name");
_calendar.CGColor = [[UIColor grayColor] CGColor];

calendar.source = [self lookForTheCalDAVSource];
NSError *error = nil;            
            
if (![_eventStore saveCalendar:_calendar commit:YES error:&error]) 
                NSLog(@"%@",error.localizedDescription);


En el método lookForTheCalDAVSource que veis en el código anterior,  buscamos el source en el que vamos a añadir el calendario. Puede ser de tipo cumpleaños, local, calDav,... Lo voy a crear de tipo CalDav. Esto son los calendarios que aparecen en la aplicación iCal del dispositivo iOS. Hay que comprobar si existe antes de añadírselo a la propiedad source de nuestro nuevo calendario.


- (EKSource *)lookForTheCalDAVSource
{
    EKSource *calSource;
    
    for (EKSource *source in self.eventStore.sources)
        if (source.sourceType == EKSourceTypeCalDAVcalSource = source;
    
    return calSource;
}

Ya solo nos queda crear el evento en nuestro nuevo calendario:

EKEvent *newEvent = [EKEvent eventWithEventStore:self.eventStore];
newEvent.title = @"Mi nuevo evento";
newEvent.startDate = [NSDate date];
newEvent.endDate = [NSDate date];
newEvent.allDay = YES;
newEvent.calendar = self.calendar;

NSError *error = nil;
[self.eventStore saveEvent:newEvent span:EKSpanThisEvent error:&error];
if (error) 
{
        NSLog(@"%@",error.description);
}




La fecha de inicio y fin es la misma ya que es un evento de un día (all day = yes). Lo lógico sería que estas fechas las cogierais de algún textfield que tuviese fechas, pero esto es solo un ejemplo.

¡Disfrutadlo!

No hay comentarios:

Publicar un comentario