[英]cellForRowAtIndexPath called too late
每當從網絡獲取的一些數據可用時,我都試圖重新加載表。 這就是我所擁有的:
SearchDataViewController:- (void)parseDataXML { parsingDelegate = [[XMLParsingDelegate alloc] init]; parsingDelegate.searchDataController = self; // CONTAINS THE TABLE THAT NEEDS RE-LOADING; ImplementedSearchViewController *searchController = [[ImplementedSearchViewController alloc] initWithNibName:@"ImplementedSearchView" bundle:nil]; ProjectAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; NSArray *viewControllers = [[NSArray alloc] initWithObjects:nav, searchController, nil]; self.splitViewController.viewControllers = viewControllers; [viewControllers release]; // PASS A REFERENCE TO THE PARSING DELEGATE SO THAT IT CAN CALL reloadData on the table parsingDelegate.searchViewController = searchController; [searchController release]; // Build the url request used to fetch data ... NSURLRequest *dataURLRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]]; parsingDelegate.feedConnection = [[[NSURLConnection alloc] initWithRequest:dataURLRequest delegate:parsingDelegate] autorelease]; }
ImplementedSearchViewController:- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSLog(@"count = %d", [keys count]); // keys IS A NSMutableArray return [self.keys count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... cell.textLabel.text = [keys objectAtIndex:row]; ... }
XMLParsingDelgate:-(void) updateSearchTable:(NSArray *)array { ... [self.currentParseBatch addObject:(NSString *)[array objectAtIndex:1]]; // RELOAD TABLE [self.searchViewController.table reloadData]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"..."]) { self.currentParseBatch = [NSMutableArray array]; searchViewController.keys = self.currentParseBatch; ... } ... } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"..."]) { ... [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; } ... }
我的問題是,當我調試時,調用會在reloadData和numberOfRowsInSection之間進行,直到keys數組中填充了最后一個數據,即cellForRowAtIndexPath的調用時間:
reloadData -> numberOfRowsInSection reloadData -> numberOfRowsInSection ... reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
我想要的是表格針對我發送的每個元素進行更新,一個接一個:
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath ... reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
任何想法為什么這種行為?
謝謝!
您是否在問如何加載整個表視圖的一部分? 如果是這樣,那么您可以為此目的使用relaodRowsAtINdexPath:或reloadSectionsAtIndexPath,這是參考TableView ref ...
從[self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO];
到[self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES];
解決了我的問題。
問題出在您使用線程而不僅僅是“僅”打開或關閉標志。在不同線程上執行選擇器,它將開始起作用。您還可以使用performSelectorOnBackground
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.