oij*_*djn 5 ios swift rx-swift rxdatasources
我想知道 reloadTableView 的结束然后我想向下滚动到表格视图的底部。
在我使用之前RxSwift
就在之后reloadData
可以使用setContentOffSet或ScrollToRow。
我用我找到的代码试了一下。从来没有叫过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)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 0
UITableView.endUpdates()在这里不会对您有帮助,因为您没有直接调用它,并且在幕后可能根本不会调用它(至少使用 rx 包装器)。
更合理的解决方案是观察方法的调用layoutSubviews(),您可以验证单元格是否在此布局周期中重新加载并且它们存在 - 然后您可以滚动到它们。如果layoutSubviews()被调用但单元格尚未出现在表视图中,那么您等待下一个周期并再次检查。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |