【问题标题】:TableView error delegate, proxy changed from the time it was first setTableView 错误委托,代理从第一次设置时就改变了
【发布时间】:2018-10-01 20:44:55
【问题描述】:

我收到此错误:

assert(proxy === DelegateProxy.currentDelegate(for: object), "代理 从最初设置的时间开始改变。

原文:(代理)

现有: (String(描述:DelegateProxy.currentDelegate(for: object)))")

我有两个 observables 可以处理不同状态的 xib 故事板,但是一旦加载了其中一个,我就会收到上述错误,我尝试使用 self.tableView.delegate = nil & self.tableView.dataSource = nil,但它在 .bind(to:) 函数上导致了这种情况。我的问题是在这个错误之前我不知道如何处理它:

断言失败:代理从第一次设置开始就改变了。

原文:

.asObservable().bind(to:(tableView?.rx.items(cellIdentifier: 
      aTableViewCell.Identifier, cellType: HaTableViewCell.self))!


func initTableView() {

    // pull to refresh
    aViewModel
        .isLoading
        .asObservable()
        .subscribe({ (loading) in
            if loading.element == false { 
            } else {
                self.tableView!.delegate = self // loads a shimmering view
                self.tableView!.dataSource = self
            }
        })
        .disposed(by: disposeBag)

    aViewModel
        .datas
        .asObservable()
        .bind(to:(tableView?.rx.items(cellIdentifier: aTableViewCell.Identifier, cellType: HaTableViewCell.self))!) { (index, element, cell) in
         // when the data is fired load this tableview cell
        }.disposed(by: disposeBag)
}

如何在数据 Observables 启动之前将 tableview 设置为 nil?

这是一个警告你已经有一个委托(或数据 来源)之前设置的某个地方。您尝试执行的操作? 将清除该委托(数据源),这意味着您的某些依赖于该委托(数据源)设置的 ? 功能可能会停止工作。如果您对此没问题,请尝试在此操作前将委托(数据源)设置为nil

【问题讨论】:

    标签: swift uitableview observable rx-swift


    【解决方案1】:

    我并不完全清楚你想要达到什么目的。

    一般来说,在使用 RxDataSources 时,你应该设置 'tableView.dataSource' 或 'tableView.delegate'。

    如果你想将不同的 observables 作为数据源绑定到同一个 tableView,'.switchLatest()' 操作符就是你所需要的。

    【讨论】:

    • 我试图在加载数据期间拥有一个闪闪发光的视图,一旦数据存在,就会在表格视图中显示数据。我正在使用 FBShimmer 库。我在没有使用 RxSwift 的情况下设置了闪烁的视图,但 RxSwift 仅在我有数据可观察数​​据时使用。
    • @RHJ 我认为那里没有问题。您可以通过“dataSource.configureCell”和“tableView.rx.willDisplayCell”方法完全控制您的单元格。通过上述方法之一提供您闪闪发光的视图。
    • 我没有使用 RxDataSources,你推荐我在加载数据期间使用闪烁的表格视图单元格吗?闪闪发光的视图没有可观察的,可以吗?我只用过 RxSwift、RxCocoa。
    • @RHJ 啊,我没有意识到你没有使用它。事实上,我肯定会推荐 RxDataSources,它是目前最有用的 Rx 框架之一。请参阅其页面上的示例 - github.com/RxSwiftCommunity/RxDataSources
    • 我将如何解决这个库的闪烁问题?闪烁的视图基本上只是空视图,我里面没有数据?
    【解决方案2】:

    每次您通过 RxCocoa 关联到一个委托时,您都需要确保您清理了该一次性用品,以便与不同的重复使用。

    在swift中你不需要设置为nil,指向其他内存槽就可以了。

    func refreshTableView() {
    
    disposable = DisposeBag()
    // pull to refresh
    aViewModel
        .datas
        .asObservable()
        .bind(to:(tableView?.rx.items(cellIdentifier: aTableViewCell.Identifier, cellType: HaTableViewCell.self))!) { (index, element, cell) in
         // when the data is fired load this tableview cell
        }.disposed(by: disposeBag)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 1970-01-01
      • 2013-01-04
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多