共计 1550 个字符,预计需要花费 4 分钟才能阅读完成。
我的项目中,须要在进入 UIViewController 后对它外面的 UITableView 滑动到最底部,那么须要把代码写在 viewDidLoad 中。
上面这一行代码要使得 previewTable 这个 UITableView 滑动到最底部的地位。(home.tickTasks 是我对代码中这个 tableView 的数据源,可依据理论须要设置)
self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
然而,不论是否须要动画,以上代码总是不能精确地滑动到指定地位,滑动的动作须要一点点工夫。
以下应用同步机制来期待一小段时间。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
}
猜测,是因为代码管制对 tableView 的滑动须要在 tableView 初始化好并且把 cell 的数据加载进来之后,如下代码,若这样写,则会呈现 tableView 划不到最底部的状况。
override func viewDidLoad() {super.viewDidLoad()
bindTableView() // 配置 tableView 的 dataSource、delegate 等信息
loadFromCoreData() // 加载数据到 tableViewCell 中
self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
// 此时存在数据未加载实现但滑动动作异步执行,所以未滑到最底部,滑动就被终止了。}
问题出在于未加载实现就进行界面的滑动,所以咱们让对界面滑动略微提早 0.01 秒,如下代码所示
override func viewDidLoad() {super.viewDidLoad()
bindTableView()
loadFromCoreData()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
}
}
此时就能够滑动到最底部了,但还有一个小问题,下面的 row 为 Home.tickTasks.count – 1,当 count 为 0 时程序会闪退,因为 index 越界了,所以像上面一样预先判断 count 即可解决问题。
override func viewDidLoad() {super.viewDidLoad()
bindTableView()
loadFromCoreData()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
if Home.tickTasks.count > 0 {self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
}
}
}
正文完