RxSwift 如何知道 TableView 重新加载结束



我想知道重新加载表视图的结束然后我想向下滚动到表视图的底部。

在我使用RxSwift之前刚过reloadData可以使用setContentOffSetScrollToRow.

我用我找到的代码尝试了一下。从来没有叫过endUpdates.

var replyList : BehaviorRelay<[Reply]>!
func bind(){
    replyViewModel.replyList
       .asDriver()
       .drive(replyTableView.rx.items){ [weak self] (tableView,row,item) in
           return self?.makeReplyCell(tableView: tableView, replyInfo: item) ?? UITableViewCell()
                }
       .disposed(by: disposeBag)
    replyTableView.endUpdatesEvent
        .asObservable()
        .subscribe({ _ in
            print("Scroll To Bottom")
        })
        .disposed(by: disposeBag)
}
import Foundation
import RxCocoa
import RxSwift
extension UITableView {
    /// Reactive wrapper for `UITableView.insertRows(at:with:)`
    var insertRowsEvent: ControlEvent<[IndexPath]> {
        let source = rx.methodInvoked(#selector(UITableView.insertRows(at:with:)))
                .map { a in
                    return a[0] as! [IndexPath]
                }
        return ControlEvent(events: source)
    }
    /// Reactive wrapper for `UITableView.endUpdates()`
    var endUpdatesEvent: ControlEvent<Bool> {
        let source = rx.methodInvoked(#selector(UITableView.endUpdates))
                .map { _ in
                    return true
                }
        return ControlEvent(events: source)
    }
    /// Reactive wrapper for when the `UITableView` inserted rows and ended its updates.
    var insertedItems: ControlEvent<[IndexPath]> {
        let insertEnded = Observable.combineLatest(
                insertRowsEvent.asObservable(),
                endUpdatesEvent.asObservable(),
                resultSelector: { (insertedRows: $0, endUpdates: $1) }
        )
        let source = insertEnded.map { $0.insertedRows }
        return ControlEvent(events: source)
    }
}

UITableView.endUpdates()在这里不会帮助你,因为你没有直接调用它,而且在引擎盖下它可能根本不被调用(至少使用 rx 包装器(。

更合法的解决方案是观察layoutSubviews()方法的调用,您可以在其中验证单元格是否在此布局周期中重新加载并且它们存在 - 然后您可以滚动到例如它们。如果调用了layoutSubviews()但单元格尚未出现在表视图中,则等待下一个循环并再次检查它。

最新更新