Iphone cellForRowAtIndexPath调用太晚
每当我从网络上获得的数据可用时,我都会尝试重新加载一个表。这就是我所拥有的: SearchDataViewController:Iphone cellForRowAtIndexPath调用太晚,iphone,uitableview,ipad,Iphone,Uitableview,Ipad,每当我从网络上获得的数据可用时,我都会尝试重新加载一个表。这就是我所拥有的: SearchDataViewController: - (void)parseDataXML { parsingDelegate = [[XMLParsingDelegate alloc] init]; parsingDelegate.searchDataController = self; // CONTAINS THE TABLE THAT NEEDS RE-LOADING;
- (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来实现此目的,这里有一个参考…从
[self-performSelectorOnMainThread:@selector(updateSearchTable:)更改为对象:数组waitUntilDone:NO]
到[自执行选择器onmainthread:@selector(updateSearchTable:)with object:array waitUntilDone:YES]代码>解决了我的问题 问题在于使用线程,而不是“只是”打开或关闭标志。在不同的线程上执行选择器,它就会开始工作。也可以使用performSelectorOnBackground否。我的问题是重新加载数据只调用numberOfRowsInSection,而不调用cellForRowAtIndexPath。当kjeys数组被填充时,最后一次调用numberOfRowsInSection后,会调用cellForRowAtIndexPath。我不确定,重新加载数据会重新加载整个tableview,因此numberOfRows将首先被调用,然后它会为所有行调用CellForRowAtexPath…这就是问题所在,调用numberOfRowsInSection后不会调用cellForRowatIndexPath,它仅在用最后一个元素填充my keys数组后才会被调用。我已经更新了我原来帖子的最后一部分,以便更好地解释情况。