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

-descriptionNSObject から継承されたメソッドであり、NSObject プロトコルの一部です。NSString *オブジェクトの説明を含む を返します。すべてのクラスはそれをオーバーライドして、任意の NSString を返すことができます。

-valueForKey:-descriptionすべてのオブジェクトでそのメソッドを呼び出した結果を含む配列を返します。これは、配列ではなく[tmp valueForKey:@"description"]a を返すように見えるため、ここでは当てはまらないようです。NSString *配列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 に答える