Магазин календаря: как отличить календарь событий от календаря задач?
Я работаю над приложением, которое имеет компонент напоминания. Я использую CalendarStore, чтобы получить список календарей, и я хочу, чтобы пользователь сам выбирал, к какому календарю он хотел бы добавить задачу. Проблема в том, что CalCalendar, похоже, не различает календари событий и календари задач.
NSArray* calendars = [[CalCalendarStore defaultCalendarStore] calendars];
for( CalCalendar* aCalendar in calendars ) {
if( aCalendar.isEditable ) {
NSLog( @"editable calendar: %@", aCalendar );
}
}
Это выводит:
editable calendar: CalCalendar <0x6e04d10> {UID = 8AA8FFAD-D781-47F7-9231-CF66E1753983; title = Work; notes = (null); color = NSCalibratedRGBColorSpace 0.054902 0.380392 0.72549 1; type = CalDAV; editable = 1}
editable calendar: CalCalendar <0x6e05000> {UID = A7F4A1B2-D1CF-4A20-9F84-CD1A1E99773E; title = Home; notes = ; color = NSCalibratedRGBColorSpace 0.72549 0.054902 0.156863 1; type = CalDAV; editable = 1}
editable calendar: CalCalendar <0x6e050f0> {UID = 43B14D2A-9976-461C-8EFE-5FA029381828; title = Personal; notes = (null); color = NSCalibratedRGBColorSpace 0.901961 0.784314 0 1; type = CalDAV; editable = 1}
editable calendar: CalCalendar <0x6e05140> {UID = F42EC365-20AC-4251-B45E-FB7F169928F0; title = Mac; notes = (null); color = NSCalibratedRGBColorSpace 0.054902 0.380392 0.72549 1; type = Local; editable = 1}
editable calendar: CalCalendar <0x6e05190> {UID = FF771FF9-3969-4001-BBA4-9B7B00E80291; title = Cloud 2; notes = (null); color = NSCalibratedRGBColorSpace 0.054902 0.380392 0.72549 1; type = CalDAV; editable = 1}
editable calendar: CalCalendar <0x6e051e0> {UID = 40234537-869C-4CC2-89B9-DD4F7D36C169; title = Groceries; notes = ; color = NSCalibratedRGBColorSpace 0.443137 0.101961 0.462745 1; type = CalDAV; editable = 1}
Я знаю, что первые 2 - это календари событий, а последние 4 - списки задач. И, iCal определенно знает разницу, потому что он показывает только календари событий для событий и календари задач для задач.
Но, похоже, через API Магазина Календаря нет способа определить это программно, если я что-то не упустил.
Обновление: я вижу, что я не единственный, кто это заметил, так как нашел rdar: // 10377730. Я только что подал свой собственный отчет, как rdar://10980542
1 ответ
Я не очень доволен этим, но обходной путь, который я использую сейчас, состоит в том, чтобы просто попытаться создать задачу в каждом календаре. Если вы попытаетесь создать задачу в календаре событий, вы получите ошибку. Это выглядит примерно так:
- (BOOL) isCalendarAUsableTaskList:(CalCalendar*)aCalendar
{
if( !aCalendar.isEditable ) return NO;
// Try to make a task here.
CalTask* newTask = [CalTask task];
newTask.calendar = aCalendar;
newTask.title = @"Test Item";
NSError* anError = nil;
if( ![[CalCalendarStore defaultCalendarStore] saveTask:newTask error:&anError] ) {
// Couldn't make a task, this calendar is no bueno.
NSLog( @"Error saving task to calendar %@ (%@)", aCalendar.title, [anError localizedDescription] );
return NO;
}
// Created a task. Now clean up on our way out.
NSLog( @"Saved task to calendar %@", aCalendar.title );
[[CalCalendarStore defaultCalendarStore] removeTask:newTask error:nil];
return YES;
}