tableView 滚动到最新单元格的底部 - scrollToRow() 的问题



我正在制作一个聊天应用程序,我正在尝试使tableView滚动到最近发送的消息的底部。

下面是我的协议方法的代码片段:

extension ChatViewController: UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell", for: indexPath) as! MessageCell
cell.message.text = messages[indexPath.row].messageContent
cell.userName.text = messages[indexPath.row].sender
// The method below causes an error that crashes the app at runtime
messageTableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true)

最后一行会导致以下错误:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee29d4ff8

这似乎表明由无限循环引起的某种溢出(因为消息甚至不会在屏幕上加载(。如果我注释掉scrollToRow方法,应用程序运行良好,尽管 tableView 显然不会滚动到最新消息的底部。

你知道是什么原因造成的吗?

在重新加载表视图后使用此代码。不要在 CellForRow 方法中调用它

let indexPath = IndexPath(row: messages.count - 1, section: 0);
yourTableView.scrollToRow(at: indexPath, at: .top, animated: false)

不要将下面的代码放在逐行的单元格中,因为每次单元格加载时都会逐行调用。 所以这就是它为你带来问题的方式(在运行时使应用程序崩溃(。

messageTableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true(

不要在单元格中为行调用此方法,而是在表重新加载数据后调用该方法。

let indexPath = IndexPath(行: messages.count - 1, section: 0(; yourTableView.scrollToRow(at: indexPath, at: .top, animated: false(

最新更新