问题描述
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSDictionaryI 0x608000465600> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key selectedStatus.'
先说一下我遇到这个问题时的情况:一个 cell 在正常显示情况下它的右边不会出现任何的东西(其实这个 cell 在创建的时候右边是添加了一个 imageView的,只是创建好之后它默认是不显示的),但是当它被选中之后右边的 imageView 就会显示出来,在数据源数组中存放的是和 cell 一一对应的一个不可变字典,在字典中有一个 BOOL 类型的值来控制 cell 右边 imageView 的显示。在 cell 被选中之后需要从数据源数组中取出对应的不可变字典来改变其中控制 imageView 显示的 BOOL 值,改完之后重新覆盖回数据源数组中去,替换当前 cell 所对应的字典。然后刷新当前 cell 所对应的这一行。
决解办法
NSDictionary *selectedDic =self.dataSource[indexPath.row];
下面的这一步很关键,假如没有这一步程序就会 Creash ,因为在数组中的不可变字典不会响应 setObject:forKey: 或者 setValue:forKey:方法
NSMutableDictionary *newDic = selectedDic.mutableCopy;
NSNumber *number = selectedDic[@"selectedStatus"];
BOOL isShow = [number boolValue];
BOOL newStatus = !isShow;
可变字典使用该方法更新字典中的值就不会有问题,假如这里不使用可变字典 newDic 而是使用不可变字典 selectedDic ,那么就会遇到上面的问题
[newDic setValue:@(newStatus) forKey:@"selectedStatus"];
[self.dataSource replaceObjectAtIndex :indexPath.row withObject :newDic];
[tableView reloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationAutomatic];