2012-03-03 1 views
1

Je travaille sur une application qui a un composant de rappel. J'utilise Calendar Store pour obtenir la liste des calendriers et je souhaite que l'utilisateur choisisse le calendrier auquel il souhaite ajouter une tâche. Le problème est, CalCalendar semble ne pas faire la distinction entre les calendriers d'événements et les calendriers de tâches.Calendrier magasin: comment distinguer le calendrier des événements du calendrier des tâches?

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

Ce sorties:

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} 

Je sais que les 2 premiers sont des calendriers d'événements, et les 4 derniers sont des listes de tâches. De plus, iCal connaît parfaitement la différence, car elle affiche uniquement les calendriers d'événements pour les événements et les calendriers de tâches pour les tâches.

Mais il ne semble pas y avoir moyen via les API du magasin de calendriers de le déterminer par programme, sauf si quelque chose me manque.

Mise à jour: Je vois que je ne suis pas le seul à le remarquer, car j'ai trouvé rdar://10377730. Je viens de déposer mon propre rapport, comme rdar://10980542

Répondre

1

Je ne suis pas super content de cela, mais la solution de contournement que j'utilise maintenant consiste simplement à essayer de créer une tâche dans chaque calendrier. Si vous essayez de créer une tâche dans un calendrier d'événements, vous obtiendrez une erreur. Il ressemble un peu à quelque chose comme:

- (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; 
} 
Questions connexes