怎么知道reloadData()完成了他的任务?

Har*_*cha 11 uitableview reloaddata ios swift

我想滚动到给定的索引(self.boldRowPath),但是当我scrollToRow之前执行调试时reloadData().

怎么知道reloadData已经完成了?

func getAllTimeEvent()  {
    self.arrAllTimeEvent = ModelManager.getInstance().getAllTimeEvent(from: self.apportmentDateFrom, to: self.apportmentDateTo)
    self.tblTimeEvent.reloadData()
    self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true)
 }
Run Code Online (Sandbox Code Playgroud)

任何帮助都感激不尽.

Far*_*dad 22

尝试这样做,它应该工作:

self.tblTimeEvent.reloadData()
DispatchQueue.main.async(execute: {
    self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true)
})
Run Code Online (Sandbox Code Playgroud)

这将在主线程上执行scrollToRow,这意味着在reloadData完成后(因为它在主线程上)

  • 调用reloadData()时,它将在主线程上重新加载自身,因此在重新加载时无法滚动tableview。您在主线程上调用它,因此它在reloadData完成之后就开始排队。@蜜糖 (3认同)

Jul*_*ere 5

正如在这个答案中所解释的那样,重新加载UITableView会在下一个布局运行时发生(通常,当您将控制返回到运行循环时).

因此,您可以使用主调度队列在下一个布局之后安排代码.在你的情况下:

    func getAllTimeEvent()  {
        self.arrAllTimeEvent = ModelManager.getInstance().getAllTimeEvent(from: self.apportmentDateFrom, to: self.apportmentDateTo)
        self.tblTimeEvent.reloadData()
        DispatchQueue.main.async {
            self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true)
        }
    }
Run Code Online (Sandbox Code Playgroud)

您也可以通过手动调用强制布局layoutIfNeeded.但这通常不是一个好主意(前一个选项是最好的):

    func getAllTimeEvent()  {
        self.arrAllTimeEvent = ModelManager.getInstance().getAllTimeEvent(from: self.apportmentDateFrom, to: self.apportmentDateTo)
        self.tblTimeEvent.reloadData()
        self.tblTimeEvent.layoutIfNeeded()
        self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true)
    }
Run Code Online (Sandbox Code Playgroud)