在 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 上无效

将 UITableView 大小调整为 iPhone 5/5s

iPhone + UITableView