在 NSXMLParser 方法 didFinishElement 中为 UITableView 调用 reloadData 无效
Calling reloadData for UITableView in NSXMLParser method didFinishElement has no effect
每次在 XML 文件中解析完一个元素时,我都会尝试更新单元格 UITableView 列表。
我尝试通过 运行 我的 UITableViewController 中的以下代码来做到这一点:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
[self.tableView reloadData];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (!([string isEqualToString:@"\n "] || [string isEqualToString:@"\n"])) {
[_idArray addObject:string];
}
}
使用断点我可以看到在每个元素完成后调用行 [self.tableview reloadData]
。但是,table视图不会更新为正确的文本。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
// Configure the cell...
if (_idArray.count > 0) {
[cell.detailTextLabel setText:[_idArray objectAtIndex:indexPath.row]];
}
return cell;
}
我将 numberofrowsinsection
设置为 _idArray.count
,将 numberofsectionsintableview
设置为 1
TableView 已正确设置为此文件中的委托和数据源
如果我在每个 reloadData
之后添加一个 sleep(1)
,它会等待一秒钟并正确地 NSLog
s,但不会重新加载实际的 table。
当整个文件解析完成后,它们突然都正常显示了。
如何让它们以正确的方式逐渐显示?
试试这个——将 reloadData 包装在主队列 GCD(Grand Central Dispatch)中
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
}
}
}
每次在 XML 文件中解析完一个元素时,我都会尝试更新单元格 UITableView 列表。
我尝试通过 运行 我的 UITableViewController 中的以下代码来做到这一点:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
[self.tableView reloadData];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (!([string isEqualToString:@"\n "] || [string isEqualToString:@"\n"])) {
[_idArray addObject:string];
}
}
使用断点我可以看到在每个元素完成后调用行 [self.tableview reloadData]
。但是,table视图不会更新为正确的文本。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
// Configure the cell...
if (_idArray.count > 0) {
[cell.detailTextLabel setText:[_idArray objectAtIndex:indexPath.row]];
}
return cell;
}
我将 numberofrowsinsection
设置为 _idArray.count
,将 numberofsectionsintableview
设置为 1
TableView 已正确设置为此文件中的委托和数据源
如果我在每个 reloadData
之后添加一个 sleep(1)
,它会等待一秒钟并正确地 NSLog
s,但不会重新加载实际的 table。
当整个文件解析完成后,它们突然都正常显示了。
如何让它们以正确的方式逐渐显示?
试试这个——将 reloadData 包装在主队列 GCD(Grand Central Dispatch)中
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
}
}
}