对此有很多很多相似的问题,但是我已经尝试了所有可以想到的事情,并试图让我的头发发挥作用!
我有一个数组,它从其他视图控制器向下传递,并深深嵌入我的代码中。我把它读到了我需要使用它的viewcontroller,我可以使用:
打印出来NSLog(@"array = %@", myarray);
返回:
2015-08-29 12:35:27.330 myapp[2679:234549] array = {
date1 = 2000;
date2 = 2010;
reference = 8;
text = "test 4";
}
所以数组存在很好,我可以很好地访问它。
但我似乎无法做最最简单的事情并使用数组中的这些值!
我尝试过通过以下方式访问第一行:
NSString *row1 = myarray[0];
但这会使应用程序崩溃。
我需要访问此数组中的数据,以便我可以使用值填充表。
有人可以帮忙???
崩溃日志:
2015-08-29 12:40:05.738 myapp [2721:236045] - [__ NSCFDictionary objectAtIndexedSubscript:]:无法识别的选择器发送到实例0x7fecd3702500 2015-08-29 12:40:05.742 myapp [2721:236045] ***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFDictionary objectAtIndexedSubscript:]:无法识别的选择器发送到实例0x7fecd3702500'
答案 0 :(得分:1)
您正在崩溃,因为您正试图从字典中获取索引值。你实际上有一本字典。
尝试
NSString *row1 = myarray[@"date1"];
答案 1 :(得分:1)
正如其他人所说,变量myarray包含一个字典。
完全解释:
在Objective-C中,包含对象的变量实际上包含指向该对象的指针。可以将其视为程序的rolodex中的一个条目。
变量有一个类型,"指向数组"的指针。它指向一个应该一个数组的对象。
但是,它可能存在于编译器中,并且变量指向实际上不是数组的东西。
要继续rolodex类比,它就好像你的rolodex中有一个管道工的条目,但电话号码(指针)实际上是屋顶工的电话号码。你打电话给这个号码然后开始询问有关管道的人。屋顶工人不明白你在说什么,然后挂断电话。 (谈话崩溃了。)
电话号码是错误类型的指针。类型管道工的指针实际上指向屋顶工人类的一个实例,所以当你开始向管道工发送水管工消息时会发生不好的事情。
以此代码为例:
- (void) typeCasting;
{
NSDictionary* aDict =
{
@"key1": @"value1",
@"key2": @"value2",
} // -1-
NSArray *anArray;
//The compiler throws an error here.
anArray1 = aDict; //-2-
//The compiler allows this due to typecasting.
anArray2 = (NSArray *) aDict; //-3-
//This code compiles but crashes at runtime.
NSString *aString = anArray2[0]; //-4-
//typecast back to dict
NSDictionary *anotherDict = (NSDictionary *) anArray2; //-5-
}
在上面标有-1-
的行上,我们创建了一个词典。
在-2-
,我们尝试将字典分配给NSArray*
类型的新变量。编译器应该抱怨它。这是编译器阻止的编程错误。
在-3-
,我们提交相同的错误,但这次我们添加了(NSDictionary*)
类型转换,告诉编译器"相信我,我知道我在做什么。 "这使我们稍后为运行时崩溃做好准备。
在-4-
,我们尝试索引anArray2
,但它并不真正包含数组,它包含字典。我们崩溃了。
我的猜测是,在你的代码的某个地方,你有一个像-3-
这样的行,你可以将字典转换为数组,然后为你的崩溃做好准备。 正确修复方法是首先不要这样做。但是,你可以"创可贴"事后重新将myarray
重新翻译回字典,如上面-5-
所示。
答案 2 :(得分:0)
您认为的数据是不数组。
myarray
的数据类型可能是NSArray
或NSMutableArray
,但分配给它的数据是不是。您可以从日志和例外中轻松看到这一点。日志显示myarray
的值为:
{
date1 = 2000;
date2 = 2010;
reference = 8;
text = "test 4";
}
这是一本字典。
异常日志[__NSCFDictionary objectAtIndexedSubscript:]
中也指出了相同的内容。它清楚地表明您正在尝试在NSArray
类型的对象上调用NSDictionary
类的方法。
发生这种情况的原因很简单。在为myarray
分配值时,编译器不会给出警告/错误,因为myarray
在运行时被赋值,这会导致异常。
<强>解决方案:强> 你可以做多件事。 2种可能的解决方案是:
myarray
的数据类型更改为NSDictionary
,这样就可以了,并将其用作词典。myarray
的值。通过在运行时检查数据并在需要时进行转换,确保分配有效数组。最简单但很容易,在将数据分配给allValues
时使用myarray
。这会将有效数组分配给myarray
,您无需触及myarray
所有者VC中的任何代码。答案 3 :(得分:0)
您正在处理NSDictionary而不是NSArray,因此myarray[0]
无法正常工作。请改用myarray[@"date1"]
,myarray[@"reference"]
,...