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

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

Заранее спасибо,

отметка


person mpemburn    schedule 08.01.2011    source источник


Ответы (3)


Поиск в документации показывает 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];    
person Dave DeLong    schedule 08.01.2011
comment
Отлично! Спасибо! Первоначальные эксперименты подтверждают, что он возвращает массив календарей. - person mpemburn; 09.01.2011
comment
поскольку свойство «календари» устарело в iOS 6.0, вы должны изменить его на NSArray *calendars = [eventStore calendarsForEntityType:EKEntityTypeEvent]; - person Riad Krim; 06.09.2013

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

//*** 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;
}
person mpemburn    schedule 06.04.2011
comment
^ Вы никогда не освобождаете хранилище событий или словарь, так что это утечки памяти. Календари, вероятно, могут иметь один и тот же заголовок, поскольку ключ в диктофоне может не работать. - person n13; 17.08.2011
comment
свойство calendars устарело в iOS 6. - person Markus Rautopuro; 26.11.2013
comment
строка NSArray *calendars работает только для iOS 6 и ниже, для 6› вам нужно использовать это: NSArray * calendars = [eventStore calendarsForEntityType: EKEntityTypeEvent]; - person cesarferreira; 19.09.2014

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

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

В любом случае - решение выше в порядке!

person n13    schedule 06.04.2011