我有一个表视图,它从实时数据库接收数据。这些数据是从表视图的底部添加的,因此该表视图必须向下滚动以显示新数据。
我找到了一种方法,但我不满意,因为滚动总是从列表的顶部开始。不是很漂亮。
以下是此方法的代码:
func tableViewScrollToBottom(animated: Bool) {
let delay = 0.1 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
let numberOfSections = self.clientTable.numberOfSections
let numberOfRows = self.clientTable.numberOfRowsInSection(numberOfSections-1)
if numberOfRows > 0 {
let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: (numberOfSections-1))
self.clientTable.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: animated)
}
})
}`
有没有办法修改此方法才能仅从前一个位置滚动?
答案 0 :(得分:2)
问题可能是行如何插入表中。例如,如果您使用类似的内容向最后添加行,则会获得非常流畅的UI:
@IBAction func didTapAddButton(sender: AnyObject) {
let count = objects.count
var indexPaths = [NSIndexPath]()
// add two rows to my model that `UITableViewDataSource` methods reference;
// also build array of new `NSIndexPath` references
for row in count ..< count + 2 {
objects.append("New row \(row)")
indexPaths.append(NSIndexPath(forRow: row, inSection: 0))
}
// now insert and scroll
tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .None)
tableView.scrollToRowAtIndexPath(indexPaths.last!, atScrollPosition: .Bottom, animated: true)
}
注意,我不会重新加载表格,而是调用insertRowsAtIndexPaths
。我关闭了动画,因为我知道它们已经关闭了屏幕,然后我会滚动到那一行。