Question

I'm working on an app that has a reminder component. I'm using Calendar Store to get a list of calendars, and I want the user to choose which calendar they'd like to add a task to. The problem is, CalCalendar seems not to distinguish between event calendars and task calendars.

NSArray* calendars = [[CalCalendarStore defaultCalendarStore] calendars];
for( CalCalendar* aCalendar in calendars ) {
    if( aCalendar.isEditable ) {
        NSLog( @"editable calendar: %@", aCalendar );
    }
}

This outputs:

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}

I know that the first 2 are event calendars, and the last 4 are task lists. And, iCal definitely knows the difference, because it shows only event calendars for events, and task calendars for tasks.

But there appears to be no way via the Calendar Store APIs to determine this programmatically, unless I'm missing something.

Update: I see I'm not the only one to notice this, as I found rdar://10377730. I've just filed my own report, as rdar://10980542

Was it helpful?

Solution

I'm not super happy with it, but the workaround I'm using now is to simply try to create a task in each calendar. If you try to create a task in an event calendar, you'll get an error. It looks a little something like:

- (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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top