Search code examples
iphoneobjective-cjsonuitableviewnsurlconnection

iPhone UITableView populateing from connectionDidFinishLoading


I have been trying for hours to figure this out. I have some JSON from a NSURLConnection. This is working fine and I have parsed it into an array. But I can't seem to get the array out of the connectionDidFinishLoading method. I an am getting (null) in the UITableViewCell method. I am assuming this is a scope of retain issue, but I am so new to ObjC I am not sure what to do. Any help would be greatly appreciated.
Cheers.

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];

SBJSON *json = [[SBJSON alloc] init];

NSDictionary *results = [json objectWithString:responseString];

self.dataArray = [results objectForKey:@"data"];

NSMutableArray *tableArray = [[NSMutableArray alloc] initWithObjects:nil];

for (NSString *element in dataArray) {
    //NSLog(@"%@", [element objectForKey:@"name"]);
    NSString *tmpString = [[NSString alloc] initWithString:[element objectForKey:@"name"]];
    [tableArray addObject:tmpString];
}
}

- (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];
}

// Configure the cell.
//cell.textLabel.text = [self.tableView objectAtIndex:indexPath.row];

cell.textLabel.text = [self.tableArray objectAtIndex:indexPath.row];
NSLog(@"%@", tableArray);
return cell;

}

Solution

    1. Get rid of the [connection release] in the 2nd line. The connection object comes in autoreleased, so this could cause crashes.
    2. It looks like you've got a property named tableArray? If so, you're redeclaring the name in this method (you should have gotten a compiler warning).

    On second thought, here's how the 2nd 1/2 of the method should look:

    NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithObjects:nil];
    
    for (NSString *element in dataArray) {
        [tmpArray addObject:[element objectForKey:@"name"]];
    }
    
    self.tableArray = tmpArray;
    [tmpArray release];