2011-07-13 57 views
7

我有一個過濾器按鈕,在彈出窗口中顯示UITableView。我有我的類別和一個「全部」按鈕來表示沒有過濾器像iTunes一樣存在。集合枚舉時發生了變化,UITableView

我在我的applicationDelegate類中有一個NSMutableDisctionary,用於設置複選標記。當應用程序啓動時,只有全部被選中,其他的都被取消選中。我想要的是當一個不是「全部」的行被選中時,該行被選中,並且全部被取消選擇。同樣,當選擇全部時,所有帶有複選標記的行都不會有複選標記,只有全部選中複選標記(就像應用程序啓動時一樣)。在我的UITableView didSelectRowForIndexPath :,我做到了這一點:

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

兩個問題。首先,我選擇第一行(全部)時出現此錯誤:

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

枚舉發生在哪裏?我想因爲我只選擇0行,所以我可以更改其他行,而不僅僅是0行。我不知道該怎麼做。

第二個問題是你想要更新模型類的方式嗎?我不確定這是否被認爲是很好的MVC。謝謝。

回答

19

枚舉是for循環。您可以迭代一個密鑰的副本,以避免在列舉時突變字典:

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