我遇到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上。如果有多个中断号码,标签需要复制自己,显示所有中断号码彼此相差20px。我最终会将它放在scrollView中,但是我知道我只是想解决这个问题。
现在我的问题是我在字典和数组上做错了什么?当我触摸地图上的多边形视图时会出现多次中断,它会显示在日志文件中,但是当我点击一次只有一次停机时它会崩溃。我是以错误的方式来做这件事的吗?错误消息发生在
[outageInfo addObject:[[outa objectForKey:@"outagenum"] objectForKey:@"text"]];
并声明
-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6d2b160
任何帮助都将不胜感激。
答案 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:
的两个对象是:
outa
[outa objectForKey:@"outagenum"]
要确定它是第一个还是第二个,请在您看到异常或崩溃的行上设置断点。然后,一旦调试器暂停该行的执行,检查这两个对象的数据类型。在lldb或gdb游标上,键入这些命令以检查有问题的对象。 po
代表打印对象,它会打印相关对象的描述。
(lldb) po outa
(lldb) po [outa objectForKey:@"outagenum"]
那应该告诉你这两个中哪一个是字符串对象。
答案 1 :(得分:0)
你在outa设置了什么样的对象(假设它是字典) [outageInfo addObject:[[outa objectForKey:@“outagenum”] objectForKey:@“text”]];
那是字符串还是字典?