0

我的 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]);
    }
}

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

4

3 回答 3

0

提供单元格信息的方法只有在您告诉它有准备显示的行时才会被调用。如果你告诉它正确的东西tableView:numberOfRowsInSection:——如果连接没有完成,它可能是 0——不应该有任何不正确的调用tableView:cellForRowAtIndexPath:.

于 2012-12-08T12:49:06.380 回答
0

只有在完成加载数据后,您才需要设置 tableview 的数据源和委托属性。如果您从 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];
}
于 2012-12-08T08:41:24.253 回答
0

这就是 ASYNCHRONOUS 网络的重点 :) 您的主线程不会等待它完成!同步在那里,但它很糟糕

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

a) 将 tableview 设置为隐藏,显示一个旋转的轮子,并在调用 connectionDidFinish 时显示并重新加载表格

模拟代码

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

-connectionDidFinish {
    spinningActivity.hidden = YES;
    [table reloadData];
    table.hidden = NO; 
}
于 2012-12-08T10:21:50.340 回答