Как мое приложение может получить список календарей на iPhone пользователя - PullRequest
11 голосов
/ 08 января 2011

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

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

Mark

Ответы [ 3 ]

21 голосов
/ 08 января 2011

При поиске в документации обнаруживается класс EKEventStore, обладающий свойством calendars.

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

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

РЕДАКТИРОВАТЬ: Начиная с iOS 6, вам нужно указать, хотите ли вы получать календаринапоминания или календари событий:

EKEventStore * eventStore = [[EKEventStore alloc] init];
EKEntityType type = // EKEntityTypeReminder or EKEntityTypeEvent
NSArray * calendars = [eventStore calendarsForEntityType:type];    
7 голосов
/ 06 апреля 2011

Код, который я использовал для получения пригодного 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;
}
2 голосов
/ 06 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...