Делегат ошибки TableView, прокси-сервер изменился с момента его первой установки
Я получаю эту ошибку:
assert (proxy === DelegateProxy.currentDelegate (for: object), "Proxy изменился с момента его первой установки.
Оригинал: (прокси)
Существующий: (Строка (описывает: DelegateProxy.currentDelegate(для: объект)))")
У меня есть две наблюдаемые, которые обрабатывают раскадровку 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?
Эта функция предупреждает вас о том, что уже есть делегат (или источник данных), установленный где-то ранее. Действие, которое вы пытаетесь выполнить? очистит этот делегат (источник данных), а это значит, что некоторые из ваших функций, которые зависят от того, какой делегат (источник данных) установлен, скорее всего, перестанут работать. Если вы согласны с этим, попробуйте установить делегат (источник данных) на
nil
перед этой операцией.
1 ответ
Мне не совсем понятно, чего вы пытаетесь достичь.
В общем, вы не должны устанавливать "tableView.dataSource" или "tableView.delegate" при использовании RxDataSources с ним.
Если вы хотите связать разные наблюдаемые в качестве источника данных с одним и тем же tableView, вам нужен оператор.switchLatest().
Каждый раз, когда вы связываетесь с делегатом через RxCocoa, вы должны убедиться, что вы очищаете этот одноразовый материал для повторного использования с другим.
В Swift вам не нужно устанавливать ноль, указание на другой слот памяти сделает всю работу.
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)
}