2011-07-13 7 views
7

Tengo un botón de filtro que presenta una UITableView en un popover. Tengo mis categorías y un botón "Todos" para indicar que no hay ningún filtro presente como en iTunes.La colección se mutó mientras se enumeraba, UITableView

Tengo un NSMutableDisccionario en mi clase applicationDelegate que utilizo para establecer las marcas de verificación. Cuando se inicia la aplicación, solo se selecciona Todo, todo lo demás se deselecciona. Lo que quiero es entonces cuando se selecciona una fila que no es "Todo", esa fila se selecciona, y Todo se deselecciona. Del mismo modo, cuando se selecciona Todo, todas las filas con marcas de verificación ya no tienen marcas de verificación, y solo se selecciona Todo con una marca de verificación (como cuando se inicia la aplicación). En mi UITableView didSelectRowForIndexPath :, Hice esto:

MyAppAppDelegate *dmgr = (MyAppAppDelegate *)[UIApplication sharedApplication].delegate; 
NSUInteger row = [indexPath row]; 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

// All selected 
if (row == 0) { 
    for (NSString *key in dmgr.CategoryDictionary) { 
     [dmgr.CategoryDictionary setObject:[NSNumber numberWithBool:NO] forKey:key]; 
    } 
    [dmgr.CategoryDictionary setObject:[NSNumber numberWithBool:YES] forKey:@"All"];     
} 

else { 

    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    NSString *key = [_categoriesArray objectAtIndex:row]; 
    BOOL valueAtKey = [[dmgr.CategoryDictionary valueForKey:key] boolValue]; 
    valueAtKey = !valueAtKey;  
    [dmgr.CategoryDictionary setObject:[NSNumber numberWithBool:valueAtKey] forKey:key]; 
} 

dos preguntas. En primer lugar, es decir, consigo este error cuando selecciono la primera fila (Todos):

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFDictionary: 0x597b3d0> was mutated while being enumerated. 

Dónde está ocurriendo la enumeración? Pensé que como solo seleccioné la fila 0, podría cambiar las otras filas también, y no solo la fila 0. No estoy seguro de qué hacer aquí.

La segunda pregunta es, ¿esta es la forma en que te gustaría actualizar tu clase de modelo? No estaba seguro de si esto se consideraba un buen MVC. Gracias.

Respuesta

19

La enumeración es for-loop. Podría repetir una copia de las teclas en su lugar para evitar la mutación del diccionario al enumerarlo:

for (NSString *key in [dmgr.CategoryDictionary allKeys]) { 
    //... 
} 
Cuestiones relacionadas