2010-05-30 3 views
2

j'ai un NSMutableArray qui contient tous les calendriers sur mon système (comme CalCalendar objets):Suppression des objets de NSMutableArray

NSMutableArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars];

Je veux retirer de calendars tous CalCalendar objets dont le titre ne comprend pas la chaîne @"work".

J'ai essayé ceci:

for (CalCalendar *cal in calendars) { 
    // Look to see if this calendar's title contains "work". If not - remove it 
    if ([[cal title] rangeOfString:@"work"].location == NSNotFound) { 
     [calendars removeObject:cal]; 
    } 
} 

La console se plaint que:

*** Collection <NSCFArray: 0x11660ccb0> was mutated while being enumerated.

Et les choses vont mal. Évidemment, il semblerait que vous ne pouvez pas faire ce que je veux faire de cette façon, donc quelqu'un peut-il suggérer la meilleure façon de s'y prendre?

Merci,

Répondre

7

Pendant que vous ne pouvez pas supprimer des éléments dans un tableau que vous utilisez l'énumération rapide, vous avez quelques options:

Comme markhunte noté, -calendars ne renvoie pas neccessarily un tableau mutable - vous auriez à utiliser -mutableCopy pour obtenir un tableau mutable que vous pouvez filtrer:

NSMutableArray *calendars = [[[[CalCalendarStore defaultCalendarStore] 
           calendars] mutableCopy] autorelease]; 

... ou par exemple -filteredArrayUsingPredicate: pour une copie filtrée immuable.

NSArray *calendars = [[CalCalendarStore defaultCalendarStore] calendars]; 
calendars = [calendars filteredArrayUsingPredicate:myPredicate]; 
+0

J'ai descendu la méthode '-filterUsingPredicate:'. Fonctionne de manière fantastique et ne nécessite que deux lignes de code! Merci beaucoup. – Garry

4

Vous ne pouvez pas modifier un tableau/liste vous énumérez (dans toutes les langues que je sache). Vous devrez créer une deuxième liste à laquelle vous ajouterez les calendriers que vous souhaitez supprimer. Puis itérer autour de la deuxième liste, en supprimant les objets de la première. Vous pouvez alors disposer de la seconde liste en ne laissant que la liste d'origine avec seulement les calendriers que vous souhaitez conserver.

0

Je NSMutableArray donnera remarqué les résultats attendus de [[CalCalendarStore defaultCalendarStore] calendriers]]. Mais le tableau renvoyé à partir des calendriers [[CalCalendarStore defaultCalendarStore]]] est en fait un NSArray et non un NSMutableArray. (a également un avertissement venir à propos de la structure attendue)

Tout cela est nouveau pour moi alors je manque quelque chose ici? ou est-ce la bonne façon d'aller sur cette tâche ..

NSMutableArray *workCals= [[NSMutableArray alloc] initWithCapacity:2]; 
[workCals addObjectsFromArray: [[CalCalendarStore defaultCalendarStore] calendars]]; 


NSString *title = @"work"; 

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"title contains[c] %@",title ]; 
[workCals filterUsingPredicate:predicate]; 
NSLog(@"workCals %@",workCals); 
[workCals release]; 

Vive.

+0

Vous avez raison, '-calendars' ne retourne pas forcément les tableaux mutables - j'ai mis à jour ma réponse. Dans l'avenir, cependant, s'il vous plaît utiliser des commentaires (vous pouvez une fois que vous avez 50 réputation) ou poser de nouvelles questions au lieu de poster des réponses. SO n'est pas un forum, c'est un site d'assurance qualité. –

+0

Merci, Mais j'offrais une réponse. Ma question était plus, est ma réponse correcte, en raison de Objective-c étant nouveau pour moi. Je vais essayer de garder les commentaires et les réponses dans les bons endroits à l'avenir. – markhunte

+0

Ah, ça ressemble plus à une question :) Si vous voulez une copie mutable, utilisez simplement '-mutableCopy' comme je l'ai indiqué dans ma réponse. –

Questions connexes