Ios 从NSArray访问值

Ios 从NSArray访问值,ios,objective-c,arrays,Ios,Objective C,Arrays,有很多很多类似的问题,但我已经尝试了每一个可以想象的事情,我正在竭尽全力让它发挥作用 我有一个数组,它是从其他ViewController传下来的,并且深深地嵌入到我的代码中。我将其读入需要使用的viewcontroller,并可以使用以下方式打印出来: NSLog(@"array = %@", myarray); 返回: 2015-08-29 12:35:27.330 myapp[2679:234549] array = { date1 = 2000; date2 = 2010; refer

有很多很多类似的问题,但我已经尝试了每一个可以想象的事情,我正在竭尽全力让它发挥作用

我有一个数组,它是从其他ViewController传下来的,并且深深地嵌入到我的代码中。我将其读入需要使用的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]-[\uu NSCFDictionary objectAtIndexedSubscript:]:发送到实例0x7fecd3702500的无法识别的选择器 2015-08-29 12:40:05.742 myapp[2721:236045]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFDictionary ObjectatinIndexedSubscript:::]:未识别的选择器发送到实例0x7fecd3702500'

你认为的数组不是数组

myarray的数据类型可能是NSArray或NSMutableArray,但分配给它的数据不是。您可以很容易地从日志和异常中看到这一点。日志将myarray的值显示为:

那是一本字典。 异常日志[\uu NSCFDictionary objectAtIndexedSubscript:]中也指出了这一点。它清楚地表明,您正试图在NSDictionary类型的对象上调用NSArray类的方法

发生这种情况的原因很简单。为myarray赋值时,编译器不会向您发出警告/错误,因为myarray在运行时被赋值,这会导致异常

解决方案: 你可以做很多事情。2种可能的解决办法是:


将myarray的数据类型更改为NSDictionary,这样就可以正常工作,并将其用作字典。 找出代码中分配给myarray的值的位置。通过在运行时检查数据并在需要时进行转换,确保分配了有效的数组。最简单但很有技巧的方法是,在将数据分配给myarray时使用AllValue。这将为myarray分配一个有效的数组,并且您不需要接触myarray所有者VC中的任何代码。
您处理的是NSDictionary而不是NSArray,因此myarray[0]无法工作。使用myarray[@date1]、myarray[@reference]、。。。相反。

您正在崩溃,因为您试图从字典中获取索引值。实际上你有一本字典

试一试


正如其他人所说,变量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-的行中,我们创建了一个字典

At-2-我们尝试将字典分配给NSArray*类型的新变量。编译器会抱怨,这是它应该抱怨的。这是编译器防止的编程错误

在-3-,我们犯了相同的错误,但这次我们添加了NSDictionary*typecast,它告诉编译器相信我,我知道我在做什么。这为我们以后的运行时崩溃做好了准备

At-4-我们尝试索引到anArray2,但它实际上并不包含数组,它包含一个字典。我们撞车了


我的猜测是,在代码中的某个地方,有一行类似于-3的代码,将字典转换为数组,并为崩溃做好准备。正确的解决方法是首先不要这样做。但是,你可以通过将你的MyRoad重新映射到字典中来帮助它,如上面的5所示。

你的数组是一个字典,作为NSLUB输出,错误信息显示。阅读认为还是没什么?我投票结束这个问题,因为OP应该已经阅读了。顺便说一句,这与Xcode无关。问题发生在您发布的代码范围之外
不知怎的,你在myarray变量中得到了一个字典。发布myarray的定义,以及在其中存储值的代码。这就是你真正的问题所在。请参阅下面我的答案,以了解有关情况的详细解释。请添加一条注释,说明您认为答案错误的原因。我理解这一点,并尝试了多种方法尝试将数组转换为字典,然后从转换后的字典中检索值。你有没有关于如何将其转换为字典,然后从中访问值的代码?将myarray的数据类型更改为NSDictionary,这样就可以了,并将其用作字典。是的,这是我的问题!我为了做这件事所做的一切都不起作用。这正是我要做的。这会导致错误预期方法读取在“NSArray*”类型的对象上找不到的dictionary元素@Richard是的,会的,因为您正试图在数组中保存dictionary,其中,您应该使用nsdictionary。这会导致错误预期方法读取“NSArray*”类型的对象上未找到的dictionary元素,这可能是因为您将字典强制转换为NSArray。将对象视为字典,它应该可以工作。如果我错了,请纠正我,但是每个对您的问题进行评论或回答的人都解释说,您处理的是字典而不是数组。我甚至评论说,您可能已经将字典转换为数组:上面的答案描述的完全相同。类型转换属于OOP的基础知识,所以我们认为您会得到它。反正我也是这么想的。
NSString *row1 = myarray[@"date1"];
- (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-
}