NSMutableDictionary setValue:forKey иногда не удается
Я использую NSMutableDictionary для хранения 3 пары ключ / значение. Значение bool в форме NSNumber. Тогда у меня есть табличное представление, которое загружает данные, если ячейка нажата, значение изменяется с ДА на НЕТ или наоборот.
Кажется, что значение изменяется правильно при нажатии ячейки, за исключением последней пары ключ / значение в словаре
NSMutableDictionary *modsDict;
NSString *test = @"test";
NSString *test1 = @"test1";
NSString *test2 = @"test2";
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSString *key = [NSString stringWithFormat: @"%@", [[modsDict allKeys] objectAtIndex: indexPath.row]];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
//enable
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[modsDict setValue: [NSNumber numberWithBool: 1] forKey: key];
}
else {
cell.accessoryType = UITableViewCellAccessoryNone;
[modsDict setValue: [NSNumber numberWithBool: 0] forKey: key];
}
}
-(void)viewDidLoad {
%orig;
modsDict = [[NSMutableDictionary alloc] init];
[modsDict setObject: [NSNumber numberWithBool: 0] forKey:test];
[modsDict setObject: [NSNumber numberWithBool: 0] forKey:test1];
[modsDict setObject: [NSNumber numberWithBool: 0] forKey:test2];
... //init tableview
}
-(void)someMethodThatIHookTo {
NSNumber *val = [modsDict objectForKey: test2];
if ([val boolValue] == YES) {
//do something
}
//this works for test and test1, but for test2 it crashed
bool lol = [[modsDict objectForKey: test2] boolValue];
if (lol) {
//so something
}
else {
}
//else is always called
if ([[modsDict objectForKey: test2] boolValue]) {
}
else { }
//if statement always true, never goes to else
}
Это три способа, которыми я пытался получить значение из NSDictionary, который я делаю [NSNumber numberWithBool: 0/1], потому что если я использую NO/YES, он вернется как YES, даже если используется NO.
Независимо от того, сколько раз я нажал на ячейку, результат от 3 способов одинаков...
Как я могу решить это?
Обратите внимание, что я использую это на THEOS, mobilesubtrate в качестве настройки.
1 ответ
Я думаю, что, возможно, вам нужно прочитать документацию немного сложнее.
Вот что для документации allKeys
говорит:
обсуждение
Порядок элементов в массиве не определен.
Имея это в виду, как вы думаете, какой результат даст следующий фрагмент из вашего кода?
[[modsDict allKeys] objectAtIndex: indexPath.row]
Вероятно, поэтому вы изобретаете суеверные убеждения, такие как:
Я делаю [NSNumber numberWithBool: 0/1], потому что, если я использую NO/YES, он вернется как YES, даже если используется NO.
Для записи:
- это просто идиоматично
@YES
а также@NO
; [NSNumber numberWithBool:0]
а также[NSNumber numberWithBool:NO]
вернет не только числа с одинаковым значением, но вернет числа с одинаковой идентичностью из-за особого случая, связанного сNSNumber
Булевы. То же самое дляYES
/ Отлична от нуля.
Исправление для вашего кода - перестать делать предположения о порядке чего-либо с неопределенным порядком. Вероятно, просто используйте массив, так как непонятно, почему вы все равно используете словарь.