我对使用JSON服务有点困难,我正在消费和迭代。当我使用服务时,由于记录的数量,我正在按照您的预期循环数据。
我将该循环数据保存到NSArray中,我稍后在UITableView中使用它。接下来,我只是简单地允许用户点击所选行(来自json数据结果)以显示更多细节。到目前为止很简单。
JSON服务中的每个元素都是NSString。到目前为止没什么棘手的。但是,服务放入NSObject后NSArray中的一个元素显示HEX代码,见下文。
altitude NSString * 0x7ff8d4cd3d30 0x00007ff8d4cd3d30
当然,应用程序已经崩溃,因为当我使用该NSArray对象显示关键元素即海拔时,它无法弄清HEX是什么。现在奇怪的是NSArray中的每个其他元素看起来如下所示。
latitude __NSCFString * @"21.45852" 0x00007ff8d4ca54f0
我已经阅读了一些建议,说明这对于NSString和JSON数据来说是正常的。但不是真的如何解决它。
我发现JSON完成后的NSArray正在改变这一个元素。我也尝试将它从INT更改为NSString,但结果相同(我知道它首先是一个NSString,我只是尝试不同的想法。)
JSON调用和循环的摘要,添加到NSArray对象中。
//Do something with returned array
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *pilotJson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//Loop through the JSON array
NSArray *currentPilotsArray = [pilotJson valueForKeyPath:@""];
//set up array and json call
pilotsArray = [[NSMutableArray alloc]init];
NSArray *keys=[pilotJson allKeys];
for (NSString *key in keys){
NSDictionary *elementDictionary=pilotJson[key];
NSString *altitude = elementDictionary[@"altitude"];
NSInteger n = [altitude intValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSString *string = [formatter stringFromNumber:@(n)];
NSString *nAltitude = [NSString stringWithFormat:@"%@ ft", string];
[pilotsArray addObject:[[LiveMap alloc]initWithaltitude:nAltitude ]];
.
.
.
因此,当我到达用户点击相关记录的代码的这一点时,我遇到了崩溃并且应用程序中止了。我假设这是来自上面的NSString vs __NSCFString
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Pass the details the the detail view controller
PilotsFlightDetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"FlightDetails"];
NSLog(@"array: %@", pilotsArray);
NSString *AltitudeString = [[self.pilotsArray valueForKey:@"altitude"]objectAtIndex:indexPath.row]; <-----WIGS OUT HERE
我发现这个超级奇怪,因为其他所有元素都能正常工作,但这个问题根本就存在问题。有什么建议吗?
更新: 根据请求,飞行员的NSLogArray。
[1] LiveMap * 0x7f8b0265e1b0 0x00007f8b0265e1b0
altitude __NSCFString * @"21 ft" 0x00007f8b02664860
也是来自Service Directly的jsonArray。
答案 0 :(得分:1)
好。我搞定了。代码没有任何问题。然而,它认出另一个名称为“海拔高度”的NSObject,由于某种原因它混淆了。
我将NSObject中的名称更改为完全唯一的名称并更新了相关位置的实例。这样做了。获得的经验总是确保您已正确命名变量。