2010-10-13 23 views
8

Me gustaría insertar eventos en mi aplicación, para que puedan verse en iPhone Calendar.app. Pero como no quiero mezclar los eventos del usuario con los de mi aplicación, quería crear un EKCalendar como "Eventos MyApp"iPhone Event Kit: crear programáticamente un EKCalendar?

¿Esto es posible? ¿Cómo podrías filtrar tus eventos de otra manera?

Gracias!

Respuesta

12

Es absolutamente posible crear su propio calendario - el problema es que necesita 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 
} 
+0

¿Cómo verificaría si el calendario ya existía? No me gustaría crear el calendario una y otra vez por accidente. – Slee

+0

Cuando crea el calendario, hay una propiedad llamada calendarIdentifier que es un identificador único. Almacene ese identificador único (y el identificador de tienda de eventos también - asegúrese de que no haya cambiado) y verifique el almacén de eventos para ver si existe antes de crearlo. – kurtzmarc

+0

Pero aquí está el problema: me parece que si mi aplicación crea un calendario local, el usuario no puede eliminarlo más tarde. Eso parece un error. – matt

2

¿Tiene usted (o alguien más) algún progreso al agregar un nuevo calendario?

Tengo la misma situación. Puedo agregar eventos al calendario predeterminado mediante programación perfectamente, pero me gustaría agregarlos a un nuevo calendario, para que no interfieran con los eventos existentes del usuario, y el usuario puede eliminarlos/esconderlos fácilmente en lugar de eliminarlos. todos los eventos de forma manual.

No puede establecer las propiedades de un nuevo objeto EKCalendar. Parece que solo puede asignar un objeto existente como defaultCalendarForNewEvents a un objeto EKCalendar.

Sin embargo, sé que es posible crear un nuevo calendario programáticamente, porque he visto la aplicación para iPhone hacer esto (sin salir de la aplicación).

  • ¿Podría ser que utilicen una solución al hacer algún truco con un archivo ICS externo?
  • Quizás es posible hacer esto "suscribiéndose" a un archivo ICS generado localmente (en el sistema de archivos de la aplicación/iPhone), en lugar de una URL. ¿Alguien tiene alguna experiencia con esto?
+0

¡Esto podría funcionar realmente! Voy a intentar esto ... – Marsson

+0

¿hay algún progreso con respecto a este asunto? – Buju

0

Así es como se puede comprobar si un calendario ya existe con el título específico. Si no existe, puede crearlo programáticamente.

Declarar una variable booleana Tipo

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; 
      } 

    } 

// por lo que ahora comprobar si nuestra variable bool contiene el valor SÍ significa que un calendario con el mismo nombre/título ya no exists.if entonces usted puede crear

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); 

     } 

    } 
Cuestiones relacionadas