小编典典

如何判断 UITableView 何时完成 ReloadData?

all

我正在尝试在 UITableView 完成执行后滚动到它的底部[self.tableView reloadData]

我原本有

 [self.tableView reloadData]
 NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];

[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

但后来我读到 reloadData 是异步的,所以滚动不会发生,因为self.tableView,[self.tableView numberOfSections]并且[self.tableView numberOfRowsinSection都是 0。

谢谢!

奇怪的是我正在使用:

[self.tableView reloadData];
NSLog(@"Number of Sections %d", [self.tableView numberOfSections]);
NSLog(@"Number of Rows %d", [self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1);

在控制台中它返回 Sections = 1, Row = -1;

当我在中执行完全相同的 NSLogs 时,cellForRowAtIndexPath我得到 Sections = 1 和 Row = 8; (8 对)


阅读 28

收藏
2022-06-23

共1个答案

小编典典

重新加载发生在下一次布局传递期间,这通常发生在您将控制权返回到运行循环时(例如,在您的按钮操作或任何返回之后)。

因此,在表视图重新加载后运行某些东西的一种方法是简单地强制表视图立即执行布局:

[self.tableView reloadData];
[self.tableView layoutIfNeeded];
 NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

另一种方法是安排您的布局后代码稍后运行dispatch_async

[self.tableView reloadData];

dispatch_async(dispatch_get_main_queue(), ^{
     NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection:([self.tableView numberOfSections]-1)];

    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
});

更新

tableView:numberOfSections:经过进一步调查,我发现表视图tableView:numberOfRowsInSection:在从reloadData.
如果委托实现tableView:heightForRowAtIndexPath:,则表视图也会在从reloadData.

但是,表格视图不会发送tableView:cellForRowAtIndexPath:tableView:headerViewForSection直到布局阶段,当您将控制权返回给运行循环时,默认情况下会发生这种情况。

我还发现在一个小型测试程序中,您问题中的代码可以正确滚动到表格视图的底部, 而无需
我做任何特别的事情(例如发送layoutIfNeeded或使用dispatch_async)。

2022-06-23