RxSwift如何知道TableView刷新结束

5

我想知道如何结束reloadTableView。 然后我想滚动到表视图底部。

以前我使用了 RxSwiftreloadData之后 可以使用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)
    }
}

我不知道在RxSwift中是否可能。但是也许你可以查看UITableView提供的观察者,而不是dataArray。 - khunshan
1个回答

0

UITableView.endUpdates() 在这里不起作用,因为您没有直接调用它,在幕后它可能根本没有被调用(至少在 rx 封装中是如此)。

更合理的解决方案是观察 layoutSubviews() 方法的调用,如果在此布局周期中重新加载了单元格并且它们存在,则可以验证它们,然后可以滚动到它们。如果 layoutSubviews() 被调用但表视图中还没有这些单元格,则等待下一个周期并再次检查。


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