2011-07-13 6 views
7

PopoverにUITableViewを表示するフィルターボタンがあります。カテゴリに「すべて」ボタンがあり、iTunesにフィルタがないことを示しています。コレクションが列挙されている間に突然変異しました。UITableView

私はチェックマークを設定するために私のapplicationDelegateクラスにNSMutableDisctionaryを持っています。アプリが起動すると、Allのみが選択され、それ以外はすべて選択解除されます。私が望むのは、「すべて」ではない行が選択され、その行が選択され、「すべて」が選択解除されるときです。同様に、「すべて」を選択すると、チェックマークの付いたすべての行にはチェックマークが表示されなくなり、「すべて」にチェックマークが付きます(アプリ起動時など)。私の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]; 
} 

2つの質問。まず、最初の行(すべて)を選択するとこのエラーが発生します。

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

列挙はどこで起こっていますか?私は行0を選択するだけなので、私は思った、私は他の行だけでなく、行0を変更することができます。私はここでこれについて何をすべきか分からない。

2番目の質問は、これがモデルクラスを更新する方法ですか?これが良いMVCと考えられるかどうかはわかりませんでした。ありがとう。

答えて

19

列挙型はforループです。代わりに、キーのコピーを繰り返して、辞書の突然変異を避けることができます。

for (NSString *key in [dmgr.CategoryDictionary allKeys]) { 
    //... 
} 
関連する問題