サーバーからのデータを解析して、このデータをアプリに表示しています。このデータは JSON データで、次のようになります。
{"getMessages":[{"msgid":"1","message":"Hello.","dateposted":"2012-08-28"}]}
その時点でメッセージを送信できるようになりますが、メッセージが利用できない場合、JSON は次のようになります。
{"status":"No messages available"}
私のアプリではNSJSONSerialization
、JSON を解析するために使用します。これが私がそれを行う方法です:
if ([data length] > 0)
{
NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:data options
NSJSONReadingMutableContainers error:nil];
if (![parsedData objectForKey:@"getMessages"])
{
[self.messageArray addObject:@"No Messages"];
}
else
{
self.messageArray = (NSMutableArray *)[parsedData objectForKey:@"getMessages"];
}
}
ご覧のとおり、parsedData にgetMessages
キーがない場合はNo Messages
in
が追加されself.messageArray
ますが、キーがある場合はそれに関連する値が追加されます。
self.messageArray
に入力するために使用した配列でしたmessageTable
。ダウンロードの最後に、コードを入れます[messageTable reloadData]
。
問題はこれです: parsedData に key が含まれている場合、テーブルのリロードは機能しますgetMessages
。ただし、キーが見つからない場合、テーブルを再ロードするとクラッシュします。
これは私のtableView:cellForRowAtIndexPath
方法です:
NSString *tableIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tableIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableIdentifier] autorelease];
if (tableView == messageTable) //I do this since there is another table I am using
{
NSString *string = [NSString stringWithFormat:@"%@", [self.messageArray objectAtIndex:0]];
if ([string isEqualToString:@"No Messages"])
{
cell.textLabel.text = string;
}
else
{
NSDictionary *dict = [self.messageArray objectAtIndex:indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"message"]];
}
}
ではmessageTable
、 の最初のインデックスが文字列 "No Messages" と等しいかどうかを最初に確認self.messageArray
します。これは、メッセージを取得できないことをユーザーに知らせるためです。文字列が等しくない場合、配列内のデータが辞書であると想定されるため、解析されてメッセージが表示されます。
ブレークポイントとログを利用した後、テーブルのリロード中にクラッシュが発生することに気付きました。メソッドの先頭にブレークポイントとログを挿入しましたtableView:cellForRowAtIndexPath
が、そこに到達することさえありませんでした。の内容を確認してみましself.messageArray
たが、「No Messages」が含まれています。
クラッシュは私にこのエラーを教えてくれます:[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x10ed84
このエラーは、NSString でメソッドを呼び出していることを示していることは知っていますが、そのobjectForKey
理由は本当にわかりません。誰でもここで私を助けることができますか?