我在用RxCocoa观察UITableView的contentOffset属性时遇到问题。
我已经尝试过RxCocoa属性:
view.tableView.rx.contentOffset
.mapAt(\.y)
.subscribe(onNext: { print($0) })
在控制台中,我一次看到(0,0),仅此而已。
我尝试用RxCocoa的代码替换它:
ControlProperty(
values: BehaviorSubject<CGPoint>(value: RxScrollViewDelegateProxy.proxy(for: view.tableView).scrollView?.contentOffset ?? CGPoint.zero),
valueSink: Binder(view.tableView) { scrollView, contentOffset in
scrollView.contentOffset = contentOffset
}
)
.subscribe(onNext: { print("myOffset", $0) })
并得到相同的结果: myOffset(0,0)一次,仅此而已。
我尝试观察其他 property ,但一无所获:
view.tableView.rx.didScroll
.subscribe(onNext: { print(view.tableView.contentOffset) })
但。我试图添加可观察间隔:
Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.subscribe(onNext: { _ in print(view.tableView.contentOffset) })
每秒钟我都有不同的点:(0,0),(0,38),(0,64)。
我正在使用:
RxCocoa(5.0.0);
RxSwift(5.0.0)
最佳答案
您尚未向我们显示实际上导致问题的代码。请注意,以下内容可以完美运行:
final class ViewController: UIViewController {
private var tableView: UITableView!
private let disposeBag = DisposeBag()
override func loadView() {
super.loadView()
tableView = UITableView(frame: view.bounds)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
view.addSubview(tableView)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableView.frame = view.bounds
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.rx.contentOffset
.map { $0.y }
.bind(onNext: { print($0) })
.disposed(by: disposeBag)
Observable.just(Array.init(repeating: "Item", count: 35))
.bind(to: tableView.rx.items) { (tableView, row, element) in
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
cell.textLabel?.text = "\(element) @ row \(row)"
return cell
}
.disposed(by: disposeBag)
}
}
关于ios - 带有RxCocoa的UITableView无法正确观察contentOffset属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57026449/