【问题标题】:RxSwift how to know end of TableView reloadRxSwift 如何知道 TableView 重新加载结束
【发布时间】:2019-04-05 08:38:17
【问题描述】:

我想知道 reloadTableView 的结束 然后我想向下滚动到表格视图的底部。

在我使用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)
    }
}

【问题讨论】:

  • 我不知道在 rxswift 中是否可行。但也许你可以看看 uitableview 提供的观察者而不是 dataArray。

标签: ios swift rx-swift rxdatasources


【解决方案1】:

UITableView.endUpdates() 在这里对您没有帮助,因为您没有直接调用它,并且在后台可能根本不会调用它(至少使用 rx 包装器)。

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

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2012-04-05
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多