setvalue:forkey:不工作,应用程序崩溃

时间:2017-02-01 11:36:40

标签: ios objective-c xcode nsdictionary

我正在开发一款应用。我尝试使用以下代码

为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];

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>

请帮我解决这个问题。

4 个答案:

答案 0 :(得分:2)

首先,您需要为对象设置testResult,为密钥设置testArray。现在,如果您想要更改它的值,则需要将其声明为NSMutableDictionary

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

答案 1 :(得分:1)

试试这个:

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

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

答案 2 :(得分: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"];

现在看结果。只有一个键值对

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

答案 3 :(得分:0)

因为您的代码中的NSDictionary testDetails只有一个值。

 testDetails:
{
    Pass = "Jan Month";
}

您需要将数组添加到字典键和值中,如下所示:

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

然后使用以下代码替换键值:

[testDetails setValue:@"Fail" forKey:@"Feb Month"];
相关问题