Rx Swift中如何自动滚动UITableView到底部

4

我是 RX Swift 的新手,需要在表格视图中显示数据,使其自动显示表格的最后一个单元格(默认向下滚动)。 以下是我的绑定数据代码:

private var dataArray = Variable<[Message]>([])
private let bag = DisposeBag()

dataArray.asObservable()
    .bindTo(tableView.rx.items) { (tableView, row, msg) in
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!

        cell.textLabel?.text = obj.title
        return cell
    }
    .addDisposableTo(bag)

这段代码将数据显示在表格视图中,但每次添加新单元格时不会滚动到表格视图底部。我可能需要添加下面这行代码,但不确定要使用哪个rx-swift运算符?

tableView.setContentOffset(CGPoint(x: 0, y : CGFloat.greatestFiniteMagnitude), animated: true)

提前感谢您。

顺便说一句,如果有人能够建议一个好的开源样例项目,该项目使用rx-swift制作,我们将不胜感激。

2个回答

4
您需要在每次dataArray发出新值时设置内容偏移量。
一个好的解决方案是:
dataArray.asObservable().map { CGPoint(x: 0, y: CGFloat.greatestFiniteMagnitude) }
  .bindTo(tableView.rx.contentOffset)
  .addDisposableTo(bag)

否则,您可以简单地执行
dataArray.asObservable()
    .do(onNext: { 
        self.tableView.setContentOffset(CGPoint(x: 0, y : CGFloat.greatestFiniteMagnitude), animated: true) 
     })
    .bindTo(tableView.rx.items) { (tableView, row, msg) in
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!

        cell.textLabel?.text = obj.title
        return cell
    }
    .addDisposableTo(bag)

do(onNext:) 用于在可观察对象发出一个值时执行副作用。这些副作用将会每个订阅者仅发生一次


谢谢Tomahh,使用do(onNext)对我有用,但它显示了一个错误,使用以下代码解决了问题: .do(onNext:{[unowned self] query in tableView.setContentOffset(CGPoint(x:0,y:CGFloat.greatestFiniteMagnitude),animated:true) }) - Vikash Kumar

1

使用 NSObject_Rx 更新 @tomahh 的内容,更新时间为 2022 年 01 月。

dataArray.asObservable().map{ _ in CGPoint(x: 0, y: CGFloat.greatestFiniteMagnitude) }
          .bind(to: tableView.rx.contentOffset)
          .disposed(by: rx.disposeBag)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接