Как мое приложение может получить список календарей на 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-системах, и это пример этого. То есть объект календаря зависит от хранилища событий, а не его собственной, отдельной сущности.
Во всяком случае, решение выше отлично!