RxSwift、RxDatasourceでUITableViewController使用時のdelegate、dataSourceエラー


1.はじめに

RxSwiftビギナーで勉強中ですが、RxSwift、RxDatasourcesを使用したTableView実装のTipsはあったのですが、UITableViewControllerを使用した場合に起きたエラーで躓いたので備忘録として残します。
理由としては、キーボード表示時にカスタムセルにあるTextFieldをスクロールさせる実装がUITableViewControllerだとデフォルトで行ってくれる為、UITableViewControllerで実装したかった。

2.環境、使用ライブラリ

・swift4.2
・Xcode10.1
・RxSwift
・RxCocoa
・RxDatasources

3.実装

RxSwift、RxDataSourcesとUITableViewControllerの実装については割愛します。(覚えてきたら載せたい)

4.エラー内容

必要な処理を実装し、ビルド、画面を表示させると以下エラーメッセージが表示されます。

Assertion failed: This is a feature to warn you that there is already a delegate (or data source) set somewhere previously. The action you are trying to perform will clear that delegate (data source) and that means that some of your features that depend on that delegate (data source) being set will likely stop working.
If you are ok with this, try to set delegate (data source) to `nil` in front of this operation.

いつも通りグーグル先生で翻訳すると

アサーションが失敗しました:これは、以前にどこかにデリゲート(またはデータソース)が既に設定されていることを警告する機能です。実行しようとしている操作によってそのデリゲート(データソース)がクリアされます。つまり、設定されているそのデリゲート(データソース)に依存する機能の一部が機能しなくなる可能性があります。
これで問題なければ、この操作の前にデリゲート(データソース)を nilに設定してみてください。

丁寧にエラーメッセージが定義されていますね。すごくわかりやすい。

5.解決法

私は翻訳する前にググってUITableViewControllerでの実装例がないか探してみたところ、Issueで同様の質問があったのでそれを先に見ました。
https://github.com/RxSwiftCommunity/RxDataSources/issues/214(https://github.com/RxSwiftCommunity/RxDataSources/issues/214)

エラーメッセージの内容と同じようなことを言っていますね。
エラーメッセージ通りdelegateをnilにしてみたところ、まだ同じエラーが出ます。

デリゲート(データソース)を nilに設定してみてください。

なので、delegateだけでなくdatasourceにもnilを入れて確認するとエラーは解消、想定通りUITableViewControllerで表示できました。
キーボード表示時のスクロール処理も問題なし。

記述箇所は下記のようにviewDidLoadで行いましたが、これが正しい位置なのか理解しきれていませんが、ひとまず。

 override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.dataSource = nil
        self.tableView.delegate = nil
}

6.まとめ

UITableViewControllerを使用してRxSwiftRxDatasourcesを使用する場合は、
delegatedatasourcenilを入れる必要があるようです。
指摘事項等、何かあればぜひコメントいただければと思います。
Rxまだ全然理解できていませんのでもっと勉強します。

追記:
ご指摘いただきました。本記事はUITableViewControllerの場合であって、ViewControllerでUITableViewを使用した場合ではありません。
UITableViewControllerを使用した場合Storyborad、Xib上でDelegate、DataSourceがデフォルトで設定されていますが、解除しても同様のエラーが発生する為、コード上でnil代入は必須のようです。
毎回nilを設定する手間を考えれば、特に理由がなければViewControllerにUITableViewを設定する方が無難かもしれません。