在UITableView中在iPhone上异步加载JSON

时间:2011-07-07 18:47:46

标签: iphone objective-c json uitableview

我正在尝试从服务器加载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;
}

1 个答案:

答案 0 :(得分:2)

此消息

-[__NSSet0 objectAtIndex:]: unrecognized selector sent to instance 0x5a4a0b0

表示代码中的某个位置,objectAtIndex:消息已发送到__NSSet0的实例。对我来说,这看起来像是在NSSet传递NSArray

在致电[results objectAtIndex:indexPath.row]之前设置调试器断点,并查看实际包含的results。我的猜测是JSON解析器没有返回你的想法。 Objective-C是动态类型的:只是因为你说变量是NSArray类型并不意味着它不能包含其他一些对象。如果函数返回类型id,则根本没有类型信息供编译器检查。