如何将最后一个单元格聚焦在ios

时间:2018-04-27 07:54:29

标签: ios swift uitableview

我正在创建一个聊天界面。

将用户的消息放入新的UITable视图单元格中。

更新表视图时,我使用以下代码。

extension UITableView {

    func scrollToBottom() {
        let rows = self.numberOfRows(inSection: 0)

        if rows > 0 {
            let indexPath = IndexPath(row: rows - 1, section: 0)
            self.scrollToRow(at: indexPath, at: .bottom, animated: true)
        }
    }
}

实际上这效果好一点,但有些奇怪。

当我关闭应用并再次打开它,或退出屏幕并再次进入后,会出现以下问题。

问题在于,当我添加一个新单元格时,它会上升到表格视图中的第一个单元格并返回到最后一个单元格。

查看问题(https://vimeo.com/266821436

随着细胞数量的增加,滚动变得太快而且太乱了。

我只想继续更新新注册的最后一个单元格。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

self.scrollToRow(at:indexPath.last ...)

答案 1 :(得分:0)

尝试使用viewDidAppear()或viewWillAppear()中的代码,并按原样使用您的代码。

<强>更新

func scrollToBottom(_ animated: Bool) {
      let y: CGFloat = self.tblchat.contentSize.height
      self.tblchat.setContentOffset(CGPoint(x: 0, y: y), animated: animated)
   }

答案 2 :(得分:0)

请使用DispatchQueue滚动,因为使用tableView加载数据执行的方法是火灾,所以我们需要花时间滚动。

extension UITableView {

    func scrollToBottom() {
        let rows = self.numberOfRows(inSection: 0)

        if rows > 0 {
            DispatchQueue.main.async {
                let indexPath = IndexPath(row: rows - 1, section: 0)
                self.scrollToRow(at: indexPath, at: .bottom, animated: true)
            }
        }
    }
}

func scrollToBottom(){
    DispatchQueue.main.async {
        let indexPath = IndexPath(row: self.array.count-1, section: 0)
        self.tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
    }
}