NSMutableDictionary setValue: forKey иногда не работает

Я использую NSMutableDictionary для хранения 3 пар ключ/значение. Это логическое значение в форме 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 в качестве настройки.


person junyi00    schedule 27.07.2014    source источник
comment
Какую ошибку вы видите?   -  person duci9y    schedule 27.07.2014
comment
Я делаю [NSNumber numberWithBool: 0/1], потому что, если я использую NO/YES, он вернется как YES, даже если NO используется. — можно ли предположить, что вы относительно новичок в Objective-C? Это просто не тот случай.   -  person Tommy    schedule 27.07.2014
comment
Вы не слишком хорошо знакомы с программированием для iOS прямо сейчас, я бы не советовал сейчас заниматься разработкой джейлбрейка. Сначала проясните свои основы.   -  person duci9y    schedule 27.07.2014
comment
@Tommy, я не могу получить ошибку, мои журналы на моем телефоне ничего не показали   -  person junyi00    schedule 27.07.2014


Ответы (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/ненулевой.

Исправление для вашего кода состоит в том, чтобы перестать делать предположения о порядке чего-либо с неопределенным порядком. Вероятно, просто используйте массив, так как неясно, почему вы все равно используете словарь.

person Tommy    schedule 27.07.2014
comment
Я использовал [NSNumber numberWithBool: NO], и результат был 1. Затем. Я погуглил и нашел этот objectivistc.tumblr.com /post/8992822737/ - person junyi00; 27.07.2014
comment
Это комментарий о GDB, отладчике, который Xcode больше не использует и который никогда не влиял на скомпилированный код. - person Tommy; 27.07.2014