1

サーバーからのデータを解析して、このデータをアプリに表示しています。このデータは 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 Messagesin が追加され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理由は本当にわかりません。誰でもここで私を助けることができますか?

4

2 に答える 2

0

これを試して

[self.messageArray removeAllObjects];
[self.messageArray addObject:[parsedData setObject:@"No Messages" forKey:@"getMessages"]];

ほとんどの場合、辞書はキーを設定していません。チェックするだけです。

また、

NSDictionary *diction = [self.messageArray objectAtIndex:0];
NSString *string = [NSString stringWithFormat:@"%@", [diction objectForKey:@"getMessages"]]; 
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"]];
}
于 2012-10-08T07:53:12.753 に答える
0

まず、messageArrayがNSMutableArrayとして定義されていることを確認してください...そして、時々 parsedDataをリロードしている場合は、これを試してください。

if (![parsedData objectForKey:@"getMessages"])
{
    [self.messageArray removeAllObjects];
    [self.messageArray addObject:@"No Messages"];
}
else
{
    [self.messageArray removeAllObjects];
    self.messageArray = [[parsedData objectForKey:@"getMessages"] mutableCopy];
}
于 2012-10-08T07:40:14.017 に答える