0

我遇到了NSdictionary和的问题NSArray。我想要完成的是UILabel在一个循环中使用不同的数据重复自己。数据来自一个 xml 文件。我正在正确解析数据,我让它显示使用:

lblAffected = [[[outageDict objectForKey:@"Outage" ]objectForKey:@"outagenum" ]objectForKey:@"text" ];

当我有多个与一次中断相关联的中断号时,我的问题就出现了。以下是我目前拥有的。

if (mapCoordinateIsInPolygon) {
    int outageIndex = [poly.title intValue];
    NSDictionary *outageDict = [sections objectAtIndex:outageIndex];
    //NSLog(@"hit, outageDict = %@", outageDict);

    for (NSDictionary *data in outageDict){
        NSArray *outageData = [outageDict objectForKey:@"Outage" ];
        NSMutableArray *outageInfo = [[NSMutableArray alloc]init];
        for(NSDictionary *outa in outageData){
            [outageInfo addObject:[[outa objectForKey:@"outagenum"] objectForKey:@"text"]];
            NSLog(@"ouatage %@", outageInfo);
        }
        int add = 0;
        NSLog(@"ouatage %i", [outageInfo count]);
        for (int i=0; i < [outageInfo count]; i++){
        add = add+20;
        lblAffected.frame = CGRectMake(130,add,320, 60);
        NSLog(@"added : %i",add);
        lblAffected.backgroundColor = [UIColor clearColor];
        lblAffected.textColor = [UIColor redColor];
        lblAffected.font = [UIFont fontWithName:@"Helvetica" size: 13.0];
        lblAffected.lineBreakMode = UILineBreakModeWordWrap;
        lblAffected.numberOfLines = 1;

        lblAffected.text = outageInfo[i];
        NSLog(@"outage Ifo %@",outageInfo[i]);
        [headerView addSubview:lblAffected];
    }
}

需要发生的是,一旦我从 outageDict 获取数据,它就需要存储在标签内并显示在 subView 上。如果有多个中断编号,则标签需要复制自身,以显示彼此下方 20 像素的所有中断编号。我最终会将它放在一个滚动视图中,但要知道我只是想解决这个问题。

现在我的问题是我在字典和数组上做错了什么?当我触摸地图上的多边形视图时出现多次中断,它会显示在日志文件中,但是当我点击一个只有一次中断时,它会崩溃。我会以错误的方式解决这个问题吗?错误消息发生在

[outageInfo addObject:[[outa objectForKey:@"outagenum"] objectForKey:@"text"]];

并指出

-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6d2b160

任何帮助,将不胜感激。

4

2 回答 2

1

您收到的错误消息是不言自明的。

-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6d2b160

您有一个字符串对象 ( __NSCFString),并且通过调用它来将其视为字典objectForKey:。由于字符串不理解此方法(或选择器),因此您会遇到异常"unrecognized selector sent to instance"

您收到此异常的行包含对 的两个不同的调用objectForKey:,异常可能来自其中任何一个。

[outageInfo addObject:[[outa objectForKey:@"outagenum"] objectForKey:@"text"]];

您在objectForKey:这里调用的两个对象是:

  1. outa
  2. [outa objectForKey:@"outagenum"]

要确定它是第一个还是第二个,请在您看到异常或崩溃的行上设置一个断点。然后,一旦调试器在该行停止执行,检查这两个对象的数据类型。在 lldb 或 gdb 光标处,键入这些命令以检查有问题的对象。po代表打印对象,它打印有问题的对象的描述。

(lldb) po outa
(lldb) po [outa objectForKey:@"outagenum"]

这应该告诉您这两个中的哪一个是字符串对象。

于 2012-12-30T00:25:18.660 回答
0

您在 outa 为 key outagenum 设置什么样的对象(假设它是字典) [outageInfo addObject:[[outa objectForKey:@"outagenum"] objectForKey:@"text"]];

那是字符串还是字典?

于 2012-12-29T23:44:18.547 回答