NSArrays和NSDictionaries

时间:2012-12-29 21:21:26

标签: iphone objective-c arrays nsmutablearray nsdictionary

我遇到NSdictionaryNSArray的问题。我想要完成的是有一个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上。如果有多个中断号码,标签需要复制自己,显示所有中断号码彼此相差20px。我最终会将它放在scrollView中,但是我知道我只是想解决这个问题。

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

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

并声明

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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"]
  3. 要确定它是第一个还是第二个,请在您看到异常或崩溃的行上设置断点。然后,一旦调试器暂停该行的执行,检查这两个对象的数据类型。在lldb或gdb游标上,键入这些命令以检查有问题的对象。 po代表打印对象,它会打印相关对象的描述。

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

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

答案 1 :(得分:0)

你在outa设置了什么样的对象(假设它是字典) [outageInfo addObject:[[outa objectForKey:@“outagenum”] objectForKey:@“text”]];

那是字符串还是字典?