在数据源之前绘制的目标c表视图单元格

时间:2012-12-08 08:18:55

标签: ios uitableview nsurlconnection

我的UITableview单元格的数据源位于:

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {

    // We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSWindowsCP1252StringEncoding] autorelease];
   // NSLog(@"xmlCheck2 = %@", xmlCheck);

    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:xmlData];
    for (int i=2; i<33; i++) {
        NSString *link=[NSString stringWithFormat:@"/html/body/table/tr[%d]/td",i];

        NSArray *elements = [xpathParser searchWithXPathQuery:link];

        NSString *date = [NSString stringWithFormat:@"%@, %@",[elements[5]text],[elements[1]text]];
        [times addObject:date];
        [names addObject:[elements[2]text]];
        [types addObject:[elements[3]text]];
        [places addObject:[elements[4]text]];

        NSLog(@"%@", elements);
        NSLog(@"%@", [elements[0] text]);
    }
}

但是,即使在绘制单元格之前连接已启动,也会在连接完成之前调用绘制单元格的方法。在绘制单元格之前,如何延迟绘制单元格方法或确保连接完成?

3 个答案:

答案 0 :(得分:0)

您需要设置tableview的数据源&amp;只有在完成加载数据后才委托属性。     如果你设置了委托和来自IB或Storyboard的tableview的数据源,将其删除。设置代表和完成加载数据后tableview的数据源属性。并重新加载表。

- (void)connectionDidFinishLoading:(NSURLConnection *)conn {

    // We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[[NSString alloc] initWithData:xmlData encoding:NSWindowsCP1252StringEncoding] autorelease];
   // NSLog(@"xmlCheck2 = %@", xmlCheck);

    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:xmlData];
    for (int i=2; i<33; i++) {
        NSString *link=[NSString stringWithFormat:@"/html/body/table/tr[%d]/td",i];

        NSArray *elements = [xpathParser searchWithXPathQuery:link];

        NSString *date = [NSString stringWithFormat:@"%@, %@",[elements[5]text],[elements[1]text]];
        [times addObject:date];
        [names addObject:[elements[2]text]];
        [types addObject:[elements[3]text]];
        [places addObject:[elements[4]text]];

        NSLog(@"%@", elements);
        NSLog(@"%@", [elements[0] text]);
    }

    [tableView setDelegate:self];// set delegate, datasource & reload data.
    [tableView setDatasource:self];
    [tableView reloadData];
}

答案 1 :(得分:0)

那是ASYNCHRONOUS网络的关键点:)你的主线程并不等待它完成! 同步就在那里,但它很糟糕

让您的UI处理数据尚未可用的情况。

a)设置tableview hidden,显示一个旋转轮,并在调用connectionDidFinish时显示并重新加载表

模拟代码

-viewWillAppear {  
    table.hidden = YES;  
    spinningActivity.hidden = NO;  
    networkConnection start];
 }

-connectionDidFinish {
    spinningActivity.hidden = YES;
    [table reloadData];
    table.hidden = NO; 
}

答案 2 :(得分:0)

只有当您告诉它有行准备显示时,才会调用提供单元格信息的方法。如果你在tableView:numberOfRowsInSection:中告诉它正确的话 - 如果连接没有完成则可能为0 - 不应该对tableView:cellForRowAtIndexPath:进行任何不正确的调用。