多くのmy tableViewには、最後のセルが画面に表示されたときにさらにデータを読み込むメソッドが必要です。同じ方法を100回実行するのを避けるために、UITableViewの独自の基本サブクラスを作成することにしました。最後のセルを表示するときに、メソッドのtableView delegate(ビューコントローラ)を呼び出し、さらにデータをロードするように要求します。データロードが成功した場合は、テーブルビューが再読み込みされます。私はこれは非常に合理的ですが、特に、私のアプリケーションのほとんどすべてのテーブルビューがこの機能を必要とする場合。デフォルトの動作でより再利用可能なUITableViewサブクラスを作成する
残念ながら、tableView:willDisplayCell:forRowAtIndexPath:
はUITableViewDelegateメソッドです。そして、私はかなり確信しています、UITableViewサブクラスをUITableViewDelegateにするのは間違っています。だから、私は基本的なUITableViewControllerクラスを作る必要があります。しかし、基底のUITableViewControllerを実装する場合は、おそらくサブクラスでtableView:willDisplayCell:forRowAtIndexPath:
をオーバーライドする必要があります。
また、私のtableViewのいくつかはTableViewControllerではなくViewControllerに組み込まれています(テーブルビュー以外のものがあります)ので、別のUITableViewControllerとUIViewControllerサブクラスが必要です。だからこれは物事をもっと複雑にしているだけです。
このように、「最後のセルを表示したときにデータをロードする」機能を再利用できるようにするにはどうすればよいですか?
編集:私はどのように開始するかを考え出したと思います。私は基本的なTableViewDelegateClassを持っていたいと思います。 BaseTableViewDelegate。次に、サブクラス化してtableView:willDisplayCell:forRowAtIndexPath:
をオーバーライドしますが、super.tableView:willDisplayCell:forRowAtIndexPath
を呼び出します。今、私はまだ問題があります。私はそれがデータをリロードするようにしたい。しかし、私はtableViewデリゲートでtableViewへの参照を持っているような気がする(参考ループかもしれない)悪い考えです。プロトコルを使った素敵なソリューションがありますか?
EDIT3:私はまた、別のアプローチを考えています:
protocol MyTableViewDelegate: UITableViewDelegate {
func default_tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
func loadMoreData()
}
extension MyTableViewDelegate {
func default_tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
if(indexPath.section == tableView.numberOfSections - 1 && indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1)
{
self.loadMoreData()
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
self.default_tableView(tableView, willDisplay: cell, forRowAt: indexPath)
//do something else here that is not done in default_tableView
}
}
class MyView: UIView, MyTableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
self.default_tableView(tableView, willDisplay: cell, forRowAt: indexPath)
}
func loadMoreData()
{
loadMoreDataFromServer(){
tableView.reloadData()
}
}
}
しかし、これは少し醜いです。
おそらく、プロトコルを継承する方がいいでしょうね。だから、私はデフォルトのものかカスタムなものかのどちらかを選択することができます。しかし、どのようにプロトコルからテーブルビューのリロードを呼び出すことができますか? –
オーバーライドする場合、デフォルト実装を呼び出すことはできますか? –
答えを編集しました。そこを見てください。また、あなたはプロトコルを継承しているわけではなく、あなたは**拡張して**その機能の1つにデフォルトの実装を与えています。 –