2011-01-08 15 views
11

Estoy escribiendo una aplicación para iPhone que usará el marco EventKit para crear nuevos eventos en el Calendario del usuario. Esa parte funciona bastante bien (excepto por la forma en que maneja la zona horaria, pero ese es otro problema). Lo que no puedo entender es cómo obtener una lista de los calendarios del usuario para que puedan elegir a qué calendario agregar el evento. Sé que es un objeto EKCalendar, pero los documentos no muestran ninguna forma de obtener toda la colección.¿Cómo puede mi aplicación obtener una lista de calendarios en el iPhone del usuario?

Gracias de antemano,

Marcos

Respuesta

21

Buscando a través de la documentación revela una clase EKEventStore que tiene una propiedad calendars.

Mi conjetura es que usted haría algo como:

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

EDIT: A partir de iOS 6, es necesario especificar si desea recuperar los calendarios de recordatorios o calendarios de eventos:

EKEventStore * eventStore = [[EKEventStore alloc] init]; 
EKEntityType type = // EKEntityTypeReminder or EKEntityTypeEvent 
NSArray * calendars = [eventStore calendarsForEntityType:type];  
+0

Excelente! ¡Gracias! Los experimentos iniciales confirman que está devolviendo una serie de calendarios. – mpemburn

+2

como 'calendarios' de la propiedad está en desuso en iOS 6.0, debe cambiar a NSArray * calendarios = [calendarios EventStoreForEntityType: EKEntityTypeEvent]; – TwiterZX

2

Aparece la lista de calendarios OK - el problema es que no obtengo una lista desplegable por el usuario. La propiedad calendar.title es nula para todos ellos; Tampoco veo ningún tipo de propiedad de identificación.

-> Actualización: Funciona ahora para mí. El error que cometí fue colocar el objeto eventStore en una variable temporal, luego obtener la lista de calendarios y luego lanzar eventStore. Bueno, si lo haces, todos tus calendarios desaparecerán también. La contención no está estrictamente orientada a objetos en algunos de los marcos de iOS, y este es un ejemplo de eso. Es decir, el objeto de calendario depende del almacén de eventos, no es su propia entidad separada.

De todos modos, la solución de arriba está bien!

+0

Tengo esto funcionando bastante bien. Ver información completa en mi respuesta. – mpemburn

7

El código que utiliza para obtener un NSDictionary útil de nombres de calendario y tipos es así:

//*** Returns a dictionary containing device's calendars by type (only writable calendars) 
- (NSDictionary *)listCalendars { 

    EKEventStore *eventDB = [[EKEventStore alloc] init]; 
    NSArray * calendars = [eventDB calendars]; 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    NSString * typeString = @""; 

    for (EKCalendar *thisCalendar in calendars) { 
     EKCalendarType type = thisCalendar.type; 
     if (type == EKCalendarTypeLocal) { 
      typeString = @"local"; 
     } 
     if (type == EKCalendarTypeCalDAV) { 
      typeString = @"calDAV"; 
     } 
     if (type == EKCalendarTypeExchange) { 
      typeString = @"exchange"; 
     } 
     if (type == EKCalendarTypeSubscription) { 
      typeString = @"subscription"; 
     } 
     if (type == EKCalendarTypeBirthday) { 
      typeString = @"birthday"; 
     } 
     if (thisCalendar.allowsContentModifications) { 
      NSLog(@"The title is:%@", thisCalendar.title); 
      [dict setObject: typeString forKey: thisCalendar.title]; 
     } 
    } 
    return dict; 
} 
+0

^Nunca sueltas la tienda de eventos o el dict, por lo que son fugas de memoria. Los calendarios probablemente tengan el mismo título, ya que una clave del dict puede no funcionar. – n13

+1

la propiedad de calendarios ha quedado obsoleta en iOS 6. –

+0

la línea de calendarios NSArray * solo funciona para iOS 6 y versiones posteriores, para 6> necesita usar esto: calendarios NSArray * = [calendarios EventStoreForEntityType: EKEntityTypeEvent]; – cesarferreira

Cuestiones relacionadas