【问题标题】:UITableView with RxCocoa is not observing correctly to contentOffset property带有 RxCocoa 的 UITableView 没有正确观察 contentOffset 属性
【发布时间】:2019-07-14 10:15:26
【问题描述】:

我在使用 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) 一次,没有别的。

我试图观察其他财产,但没有得到任何东西:

view.tableView.rx.didScroll
                .subscribe(onNext: { print(view.tableView.contentOffset) })

但是。我尝试添加 Observable 间隔:

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)

【问题讨论】:

    标签: ios swift uitableview rx-swift rx-cocoa


    【解决方案1】:

    您没有向我们展示实际导致问题的代码。请注意,以下内容完美无缺:

    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)
        }
    }
    

    【讨论】:

    • 这些部分的代码包含了太多的自定义解决方案,所以它需要抱怨:)
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多