[英]objective c table view cell drawn before data source
我的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]);
}
}
但是,即使在我繪制單元格之前就已開始連接,繪制單元格的方法還是在連接完成之前被調用。 如何在繪制單元格之前延遲繪制單元格方法或確保連接完成?
僅在完成加載數據之后,才需要設置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];
}
這就是異步網絡的關鍵:)您的主線程不等待它完成! 同步在那里,但是很糟糕
讓您的UI處理尚未提供數據的情況。
a)將tableview設置為隱藏,顯示一個紡車,並在調用connectionDidFinish時顯示並重新加載表
模擬代碼
-viewWillAppear {
table.hidden = YES;
spinningActivity.hidden = NO;
networkConnection start];
}
-connectionDidFinish {
spinningActivity.hidden = YES;
[table reloadData];
table.hidden = NO;
}
提供單元格信息的方法只有在您告訴它有准備顯示的行時才被調用。 如果您在tableView:numberOfRowsInSection:
告訴它正確的事情-如果連接未完成,則可能為0-不應對tableView:cellForRowAtIndexPath:
進行任何不正確的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.