如何滚动到viewdidload发送的最后一条消息?在快速4

时间:2018-05-02 19:54:11

标签: ios iphone swift chat swift4

目前,我已经尝试了

%t

然而它似乎不起作用,输出

func scrollToBottom(){
    DispatchQueue.global(qos: .background).async {
        let indexPath = IndexPath(item: self,messageArrat.count-1, section: 0)
        self.messageTableView.scrollToRow(at: indexPath,at:.bottom,animated:true)
    } 
}

我在viewdidload中设置委托和数据源后立即调用该函数。

6 个答案:

答案 0 :(得分:0)

首先:请将您的代码作为文字提供,而不是图像。

现在您的问题是,您正在尝试滚动到全局队列中的最后一行,但所有UI更新必须在主线程中发生,因此只需删除DispatchQueue,或者如果您不在主线程中,你可以写CategorySchema而不是全局

E.g:

DispatchQueue.main

但我认为你根本不需要DispatchQueue,所以试着完全省略它。

答案 1 :(得分:0)

它喜欢在这个主线程上工作,而不是在后台工作,因为它与UI相关

试试这段代码:

 func scrollToBottom() {

       DispatchQueue.main.async {

                    let indexPath = IndexPath(item: self.messageArrat.count-1, section: 0)                        
                    self.messageTableView.scrollToRow(at:  indexPath, at: .bottom, animated: true)
             } 
      }

答案 2 :(得分:0)

在" .async"中编写代码关闭你开始一个新线程,错误消息字面上告诉你不要这样做。

删除DispatchQueue内容及其中的内容。

请发布文字,说明和所有内容以帮助社区。

答案 3 :(得分:0)

  

您无需添加DispatchQueue:

let indexPath = IndexPath(item: self.messageArrat.count-1, section: 0)
self.messageTableView.scrollToRow(at:  indexPath, at: .bottom, animated: true)
  

如果你想要DispatchQueue,那么就像这样添加主队列:

DispatchQueue.main.async {
    let indexPath = IndexPath(item: self.messageArrat.count-1, section: 0)
    self.messageTableView.scrollToRow(at:  indexPath, at: .bottom, animated: true)
}

答案 4 :(得分:0)

可能索引路径必须超出范围,请在滚动前尝试检查行数。也可以在主线程上执行所有操作。

答案 5 :(得分:0)

听起来像是一个计时问题,你说你是从viewDidLoad调用它,尝试将它移动到viewDidAppear或viewDidLayoutSubviews。当您操作UI并且需要在主线程上发生时,也从后台线程中删除。