2017-02-01 5 views
2

Я работаю над приложением. Я попытался установить значение для конкретного ключа NSDictionary, используя следующий код,setvalue: forkey: не работает, приложение сбой

NSMutableArray *testArray=[NSMutableArray arrayWithObjects:@“Jan Month",@“Feb Month",@“Mar Month",@“Apr Month",@“May Month",@“June Month",@“July Month",@“Aug Month",@“Sep Month",@“Oct Month", nil]; 

NSMutableArray *testResult=[NSMutableArray arrayWithObjects:@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass", nil]; 

NSDictionary *testDetails=[NSDictionary dictionaryWithObjects:testArray forKeys:testResult]; 

[testDetails setValue:@"Fail" forKey:@“Feb Month"]; 

Мое приложение сбой в четвертой строке дает ошибку,

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSDictionaryI 0x1741a2f40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Feb Month.' 

Я попытался решить это, проверяя,

po [self.testDetails valueForKey:"Feb Month"] 
<extracting data from value failed> 

Пожалуйста, помогите мне в решении этого вопроса.

+1

попробовать еще раз, используя "везде, вместо того, чтобы« – Russell

+0

Не используйте 'valueForKey/SetValue: forKey', если вы не можете объяснить, почему вы явно нужны KVC Выделенные методы' objectForKey/SetObject.: forKey' или - предпочтительнее - ключевые подписи. – vadian

+0

Вы получили ключи/значения в обратном порядке. Вероятно, вы имели в виду '[NSDictionary dictionaryWithObjects: testResult forKeys: testArray];' (Первые значения _then_ keys) ... И, конечно, вы будете нужен изменяемый dict, как сказал @Nirav ... – Alladinian

ответ

2

Для всего вам необходимо установить testResult для объектов и testArray для ключей. Теперь, если вы хотите изменить его значение, вам нужно объявить его как NSMutableDictionary.

NSMutableDictionary *testDetails = [NSMutableDictionary dictionaryWithObjects:testResult forKeys:testArray]; 
[testDetails setValue:@"Fail" forKey:@“Feb Month"]; 
0

Потому что из вашего кода ваш NSDictionary testDetails будет иметь только одно значение.

testDetails: 
{ 
    Pass = "Jan Month"; 
} 

вам нужно добавить массив в словарь ключ и значение, как это:

NSMutableDictionary *testDetails = [NSMutableDictionary dictionaryWithObjects:testResult forKeys:testArray]; 

замените значение ключа с помощью этого:

[testDetails setValue:@"Fail" forKey:@"Feb Month"]; 
1

попробовать это:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:testResult,testArray, nil]; 

    [dict setObject:@"Fail" forKey:@"Feb Month"]; 
1

ли вы установить объект и ключ правильно? Также Правильно ли вы использовали NSDictionary и NSMutableDictionary?

Сначала я проверил ваш ниже код.

NSMutableArray *testArray=[NSMutableArray arrayWithObjects:@"Jan Month",@"Feb Month",@"Mar Month",@"Apr Month",@"May Month",@"June Month",@"July Month",@"Aug Month",@"Sep Month",@"Oct Month", nil]; 
NSMutableArray *testResult=[NSMutableArray arrayWithObjects:@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass", nil]; 
NSDictionary *testDetails=[NSDictionary dictionaryWithObjects:testArray forKeys:testResult]; 
[testDetails setValue:@"Fail" forKey:@"Feb Month"]; 

Теперь посмотрим result.There только одна пара ключей значение

enter image description here

Что ваша ошибка здесь вы неправильно установить ключ и объект, а также вам нужно установить значение NSMutableDictionary.

Если вы хотите отредактировать значения в словаре, вы должны использовать NSMutableDictionary, поскольку он изменен. Используя NSDictionary, вы не можете редактировать его, потому что он неизменен. Вы ничего не можете изменить.

NSMutableArray *testArray=[NSMutableArray arrayWithObjects:@"Jan Month",@"Feb Month",@"Mar Month",@"Apr Month",@"May Month",@"June Month",@"July Month",@"Aug Month",@"Sep Month",@"Oct Month", nil]; 
NSMutableArray *testResult=[NSMutableArray arrayWithObjects:@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass",@"Pass", nil]; 
NSMutableDictionary *testDetails=[NSMutableDictionary dictionaryWithObjects:testResult forKeys:testArray]; 
[testDetails setValue:@"Fail" forKey:@"Feb Month"]; 

Теперь увидеть результат печати

Printing description of testDetails: 
{ 
    "Apr Month" = Pass; 
    "Aug Month" = Pass; 
    "Feb Month" = Fail; 
    "Jan Month" = Pass; 
    "July Month" = Pass; 
    "June Month" = Pass; 
    "Mar Month" = Pass; 
    "May Month" = Pass; 
    "Oct Month" = Pass; 
    "Sep Month" = Pass; 
} 

Также смотрите скриншот ниже

enter image description here

Вы должны знать, чтобы использовать словарь первым.

Apple NSDictionary API reference says

Класс NSDictionary объявляет программный интерфейс к объектам , которые управляют неизменные ассоциации ключей и значений. Используйте этот класс или его подкласс NSMutableDictionary, когда вам нужен удобный и эффективный способ получения данных, связанных с произвольным ключом. NSDictionary создает статические словари, а NSMutableDictionary создает динамические словари. (Для удобства термина словарь относится к любому экземпляру одного из этих классов без указания своего членства точного класса.)

Apple NSMutableDictionary API reference says

Класс NSMutableDictionary объявляет программный интерфейс к объектам , которые управляют изменяемыми ассоциации ключей и ценностей. Он добавляет операции модификации к основным операциям, которые он наследует от NSDictionary.

NSDictionary vs NSMutableDictionary

Смежные вопросы