我的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]);
}
}
但是,即使在绘制单元格之前连接已启动,也会在连接完成之前调用绘制单元格的方法。在绘制单元格之前,如何延迟绘制单元格方法或确保连接完成?
答案 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:
进行任何不正确的调用。