2011-07-13 9 views
7

Bir popolasyonda UITableView sunan bir filtre düğmesine sahibim. ITunes'taki gibi bir filtrenin bulunmadığını göstermek için kategorilerim ve "Tümü" düğmesi kullanıyorum.Koleksiyon numaralandırılırken mutasyona uğradı, UITableView

Benim appDelegate sınıfında onay işaretlerini ayarlamak için kullandığım bir NSMutableDisctionary var. Uygulama başladığında, sadece Tümü seçilir, diğer her şey seçimden kaldırılır. İstediğim şey, "Tümü" olmayan bir satır seçildiğinde, o satırın seçilmesi ve Tümünün seçiminin kaldırılmasıdır. Benzer şekilde, Tümü seçildiğinde, onay işaretli tüm satırlarda artık onay işaretleri yoktur ve yalnızca bir onay işareti ile Tümü seçilidir (uygulama başladığında olduğu gibi).

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]; 
} 

İki soru: benim UITableView didSelectRowForIndexPath ise :, bunu yaptım.

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

numaralandırma

oluyor : Ben ilk satırı (Tümü) seçtiğinizde İlk deyişle, bu hatayı alıyorum? Sadece satır 0'ı seçtiğimi düşündüğümden, diğer satırları da değiştirebileceğimi düşündüm ve sadece satır 0'ı değil. Burada bu konuda ne yapacağımı bilemiyorum.

İkinci soru, model sınıfınızı güncellemenin yolu bu mu? Bunun iyi bir MVC olup olmadığından emin değildim. Teşekkürler.

cevap

19

Numaralandırma, döngüdür. Bunu numaralandırırken sözlükte mutasyona uğramamak için anahtarların bir kopyasının üzerinde yineleme yapabilirsiniz:

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