Коллекция была видоизменена при перечислении, UITableView - PullRequest
7 голосов
/ 14 июля 2011

У меня есть кнопка фильтра, которая представляет UITableView во всплывающем окне.У меня есть мои категории и кнопка «Все», чтобы обозначить отсутствие фильтра, как в iTunes.

В моем классе 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.Спасибо.

1 Ответ

19 голосов
/ 14 июля 2011

Перечисление является циклом for. Вместо этого вы можете перебрать копию ключей, чтобы избежать изменения словаря при его перечислении:

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