0

试图获得一个标签来显示从一些 JSON 中提取的数据......

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSError *myError = nil;
        NSDictionary *res = [NSJSONSerialization JSONObjectWithData:jsonresponse         options:NSJSONReadingMutableLeaves  error:&myError];
        NSArray *results =  [res objectForKey:@"current_observation"];
        NSArray *cur = [results valueForKey:@"weather"];
        NSArray *tmp = [results valueForKey:@"temp_f"];
        NSString * tmpstring = [[tmp valueForKey:@"description"] componentsJoinedByString:@""];
        temp.text = tmpstring;
    }

当它运行该代码时,它会吐出这个......

2013-01-31 15:38:03.319 Places[4659:907] -[__NSCFString componentsJoinedByString:]: unrecognized selector sent to instance 0x5680d0
2013-01-31 15:38:03.321 Places[4659:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString componentsJoinedByString:]: unrecognized selector sent to instance 0x5680d0'
*** First throw call stack:
(0x32b3e3e7 0x3a82f963 0x32b41f31 0x32b4064d 0x32a98208 0x413b 0x3347a915 0x333ba769 0x333ba685 0x3281b64f 0x3281ad33 0x32843013 0x32a84acd 0x32843473 0x327a7461 0x32b138f7 0x32b1315d 0x32b11f2f 0x32a8523d 0x32a850c9 0x3666333b 0x349a12b9 0x20c9 0x2050)
libc++abi.dylib: terminate called throwing an exception
(lldb) 

有任何想法吗?

4

2 回答 2

2

-description是继承自 NSObject 的方法,是 NSObject 协议的一部分;它返回NSString *带有对象的一些描述的 a。所有类都可以覆盖它以返回任意 NSString。

-valueForKey:-description将返回一个数组,其中包含在其所有对象上调用该方法的结果。这似乎不是这里的情况,因为[tmp valueForKey:@"description"]似乎返回 aNSString *而不是数组。我猜tmp这不是一个数组,因此您的应用程序崩溃了。

如果不知道 JSON 数据实际上是什么,就不可能说出这里出了什么问题。请用一些示例数据更新您的问题。

于 2013-01-31T20:52:57.563 回答
0

description为从 NSObject 继承的所有对象返回一个 NSString。NSString 及其祖先都没有实现componentsJoinedByString。如果要使用componentsJoinedByString,则需要将其直接发送到 NSArray 或其他实现该方法的集合对象。使用 Objective-C 中的嵌套消息传递,您需要确定返回的对象类是什么。如果您不确定,请将您的消息取消嵌套,这样您就会看到它是什么。如果您在某些情况下无法确定,最好取消嵌套消息并使用某种方法进行验证,例如

if ([object respondsToSelector:@selector(someSelector:)]) {
     // do stuff here
} else {
     // some alternative
}
于 2013-02-02T12:38:50.697 回答