iOS在开发类似聊天的页面时,需要进入页面,直接展示最新的数据。而最新数据在最底部,因此需要一进入页面,tableView直接展示在最底部位置。
滚动代码:self.tableView.scrollToRow(at: IndexPath(row: tempModels.count - 1, section: 0), at: .bottom, animated: false)
只能在viewDidAppear中调用,在viewDidLoad中或viewWillAppear中调用,不起作用。而在viewDidAppear中调用,无论animated是true或false,效果都不尽如人意。或有滚动动画,或有闪动。
百度了一圈,发现答案高度重复,在tableView数据源方法 numberOfRowsInSection中设置。但个人觉得此方式不够优雅,还会调用多次。但文章提供了很好地思路,就是contentSize确定后,才可以调用ScrollToRow方法。
因此考虑监听tableView.contentSize属性变化,当属性变化时滚动到底部。并加变量控制只在页面刚进入时调用。
我使用了RxSwift。当然,用iOS的KVO一样。目标是监听contentSize属性变化就行。
firstLoad设置成false的时机,需根据具体情况来写。因为我这里数据是从初始化方法里直接传进来的。如果数据是从网络获取的,可以写在网络请求成功的回调里。
具体代码如下:
class TestViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
private var isFirstLoad: Bool =