在 UITableView 中的 iPhone 上异步加载 JSON
Posted
技术标签:
【中文标题】在 UITableView 中的 iPhone 上异步加载 JSON【英文标题】:Loading JSON Asynchronously on iPhone in UITableView 【发布时间】:2011-07-07 18:47:45 【问题描述】:我正在尝试从服务器加载 JSON,然后将其显示在 UITableView 中。请求正常,但是当我尝试将数据添加到 tableview 时,应用程序在我调用时崩溃,然后调用 [tableView reloadData]
方法。我在 UITableView 方法中有变量 jsonArray
引用,以便 TableView 显示该变量的内容。这是最好的方法吗?我做错了什么?
连接
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
主 HTTP 回调
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
//Declare the parser
SBJsonParser *parser = [[SBJsonParser alloc] init];
jsonArray = [parser objectWithString:responseString];
[tableView reloadData];
[parser release];
[responseString release];
错误
2011-07-07 14:42:56.923 Viiad[16370:207] -[__NSSet0 objectAtIndex:]: unrecognized selector sent to instance 0x5a4a0b0
2011-07-07 14:42:56.925 Viiad[16370:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSet0 objectAtIndex:]: unrecognized selector sent to instance 0x5a4a0b0'
编辑
UITableViewMethods
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
NSArray *results = [[jsonArray valueForKey:@"Rows"] valueForKey:@"name"];
cell.textLabel.text = (NSString *)[results objectAtIndex:indexPath.row];
return cell;
【问题讨论】:
很可能 jsonArray 不是 NSArray。该应用程序在 tableView:cellForRowAtIndexPath: 方法中失败。可以发一下吗? 【参考方案1】:这条消息
-[__NSSet0 objectAtIndex:]: unrecognized selector sent to instance 0x5a4a0b0
意味着在代码中的某个地方,objectAtIndex:
消息被发送到__NSSet0
的一个实例。对我来说,这看起来就像是在传递 NSSet
,而你期待的是 NSArray
。
在调用[results objectAtIndex:indexPath.row]
之前设置调试器断点并查看results
实际包含的内容。我的猜测是 JSON 解析器没有返回您认为的内容。 Objective-C 是动态类型的:仅仅因为你说变量是NSArray
类型并不意味着它不能包含其他对象。如果函数返回类型id
,则根本没有类型信息供编译器检查。
【讨论】:
以上是关于在 UITableView 中的 iPhone 上异步加载 JSON的主要内容,如果未能解决你的问题,请参考以下文章
iphone开发:如何在UITableView上放置一个UIView [重复]
iPhone - 在 UITableView 上拖动会在后台停止渲染 OpenGL
在 iPhone 上使用 UITableView Outlet 从 UIViewController 修改 UITableViewCell
iPhone - UITableView 使用 plist 填充在模拟器中有效,但在 iDevice 上无效