Как мое приложение может получить список календарей на iPhone пользователя

Я пишу приложение iPhone, которое будет использовать фреймворк EventKit для создания новых событий в пользовательском календаре. Эта часть работает очень хорошо (за исключением того, что она управляет часовым поясом - но это еще одна проблема). Я не могу понять, как получить список пользовательских календарей, чтобы они могли выбрать, к какому календарю добавить событие. Я знаю, что его объект EKCalendar, но документы не показывают никакого способа получить всю коллекцию.

Спасибо заранее,

Марк

Ответ 1

Поиск в документации показывает класс EKEventStore, у которого есть свойство calendars.

Я предполагаю, что вы сделали бы что-то вроде:

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

EDIT:. Начиная с iOS 6, вам нужно указать, хотите ли вы получать календари напоминаний или календарей событий:

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

Ответ 2

Код, который я использовал для получения пригодного для использования NSDictionary имен и типов календаря, выглядит следующим образом:

//*** Returns a dictionary containing device 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;
}

Ответ 3

Я получаю список календарей OK - проблема в том, что я не получаю список, отображаемый пользователем. Свойство calendar.title имеет значение null для всех из них; Я тоже не вижу никакого свойства id.

- > Обновление: теперь это работает для меня. Ошибка, которую я сделал, заключалась в том, чтобы поместить объект eventStore во временную переменную, затем получить список календарей, а затем освободить eventStore. Хорошо, если вы это сделаете, все ваши календари тоже уйдут. Контекст не является строго объектно ориентированным в некоторых iOS-системах, и это пример этого. То есть объект календаря зависит от хранилища событий, а не его собственной, отдельной сущности.

Во всяком случае, решение выше отлично!