UITableView reloadData崩溃,错误[__NSCFConstantString objectForKey:]

时间:2012-10-08 07:28:56

标签: objective-c ios json uitableview

我正在从服务器解析数据并在我的应用中显示这些数据。此数据是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 self.messageArray,但如果它有密钥,则会添加与其相关的值。

self.messageArray是我用来填充messageTable的数组。在下载结束时,我输入了代码[messageTable reloadData]

问题是:如果parsedData包含密钥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中,我首先检查self.messageArray的第一个索引是否等于字符串“No Messages”,这是为了让用户知道不能检索任何消息。如果 string不相等,然后它会假设数组中的数据是字典,因此,它将被解析以显示消息。

在使用断点和日志之后,我意识到在重新加载表时发生了崩溃。我在方法tableView:cellForRowAtIndexPath的开头插入了一个断点和一个日志,但它从未到达那里。我尝试检查self.messageArray的内容,但确实包含“无消息”。

崩溃告诉我这个错误:[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x10ed84

我知道这个错误告诉我我在NSString中调用方法objectForKey,但我真的不知道为什么。谁能在这帮助我?

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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"]];
}