2011-01-08 9 views
11

Piszę aplikację na iPhone'a, która będzie używać struktury EventKit do tworzenia nowych wydarzeń w Kalendarzu użytkownika. Ta część działa całkiem nieźle (z wyjątkiem nieudolnego sposobu, w jaki obsługuje strefę czasową - ale jest to kolejna kwestia). Nie mogę się dowiedzieć, jak uzyskać listę kalendarzy użytkownika, aby mogli wybrać, do którego kalendarza dodać wydarzenie. Wiem, że jest to obiekt EKCalendar, ale dokumenty nie pokazują żadnego sposobu na pobranie całej kolekcji.W jaki sposób moja aplikacja może uzyskać listę kalendarzy na iPhone'ie użytkownika?

Dzięki z góry,

Mark

Odpowiedz

21

Przeszukiwanie dokumentacji ujawnia klasę EKEventStore który ma właściwość calendars.

Domyślam się, że chcesz zrobić coś takiego:

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

EDIT: W iOS 6, trzeba określić, czy chcesz pobrać kalendarze przypomnienia lub kalendarze wydarzeń:

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

Doskonała! Dzięki! Wstępne eksperymenty potwierdzają, że zwracają one tablicę kalendarzy. – mpemburn

+2

, ponieważ właściwość "kalendarze" jest nieaktualna w systemie iOS 6.0, należy zmienić na NSArray * kalendarze = [eventStore calendarsForEntityType: EKEntityTypeEvent]; – TwiterZX

2

Otrzymuję listę kalendarzy OK - problem polega na tym, że nie otrzymuję listy możliwej do wyświetlenia przez użytkownika. Właściwość calendar.title ma wartość NULL dla wszystkich; Nie widzę też żadnej własności id.

-> Aktualizacja: Działa teraz dla mnie. Błędem, który popełniłem, było umieszczenie obiektu eventStore w zmiennej tymczasowej, a następnie pobranie listy kalendarzy, a następnie zwolnienie obiektu eventStore. Jeśli to zrobisz, wszystkie kalendarze też znikną. Ograniczanie nie jest ściśle obiektowe w niektórych frameworkach iOS i jest to tego przykład. Oznacza to, że obiekt kalendarza jest zależny od magazynu zdarzeń, nie jest jego osobną jednostką.

W każdym razie - powyższe rozwiązanie jest w porządku!

+0

To działa całkiem dobrze. Zobacz pełną informację w mojej odpowiedzi. – mpemburn

7

Kod kiedyś dostać użytkowej NSDictionary nazw kalendarzowych i typów jest tak:

//*** 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

^Nigdy nie zwalnia się magazynu zdarzeń ani dyktowania, więc są to wycieki pamięci. Kalendarze mogą mieć ten sam tytuł, który jest używany jako klucz do dyktowania, może nie działać. – n13

+1

Właściwość kalendarzy została uznana za nieaktualną w systemie iOS 6. –

+0

Linia kalendarzy NSArray * działa tylko dla systemu iOS 6 i niższych wersji, dla 6> należy użyć tego: NSArray * kalendarze = [eventStore calendarsForEntityType: EKEntityTypeEvent]; – cesarferreira