我正在解析来自服务器的数据并在我的应用程序中显示这些数据。此数据是 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
key 时,会添加No Messages
in
self.messageArray
,但如果有 key ,则会添加与其相关的值。
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
中,我首先检查 的第一个索引self.messageArray
是否等于字符串“No Messages”,这是为了让用户知道无法检索到任何消息。如果字符串不相等,它将假设数组中的数据是一个字典,因此,它将被解析以显示消息。
在使用断点和日志之后,我意识到在重新加载表时会发生崩溃。我在方法的开头插入了一个断点和一个日志,tableView:cellForRowAtIndexPath
但它甚至没有到达那里。我尝试检查的内容,self.messageArray
它确实包含“无消息”。
崩溃告诉我这个错误:[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x10ed84
我知道这个错误告诉我我正在调用objectForKey
NSString 中的方法,但我真的不知道为什么。有人能帮我一下吗?