2

これらのプロトコルに準拠するカスタム UITableView を使用しています。

  • UITableViewDataSource
  • UIScrollViewDelegate

このテーブル ビューは、アプリの多くの場所で使用されています。バックグラウンドでの画像ダウンロードを実装しました。ユーザーがスクロールすると、追加の画像がダウンロードされます。そのため、UIScrollViewDelegate メソッドを実装する必要がありました。これらのカスタム テーブル ビューのそれぞれがメソッドの同じ実装を使用するため、ビュー コントローラーではなく、このクラスに必ずこれを含めたいと考えています。

これが問題です。ビュー コントローラーでは、セグエを実行する必要があるため、UITableViewDelegate から didSelectRowAtIndexPath メソッドを実装する必要があります。しかし、それを行う (そしてデリゲートを自分自身に設定する) と、UITableView は UIScrollView (およびそのデリゲート メソッド) を拡張するため、UIScrollViewDelegate メソッドはこのビュー コントローラーによってキャッチされ、テーブル ビューに反映されません。

これを各View Controllerに追加することで「解決」しました:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self.bookTableView scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}

しかし、この同じコード ブロック (参考までに、これはそのうちの 1 つにすぎず、他にもいくつかあります) をアプリ全体の多くの場所に配置することは、あまり良くありません。これを解決する方法はありますか?

4

2 に答える 2

0

これらのカスタム テーブル ビューのそれぞれがメソッドの同じ実装を使用するため、ビュー コントローラーではなく、このクラスに必ずこれを含めたいと考えています。

いいえ、ありません。UITableViewはビューです。ネットワークと通信することはありません。それがモデル (またはモデル コントローラー) の機能です。あなたが議論している機能は、情報の表示とは何の関係もありません。それは情報を取得することに関係しています。

あなたが望むのは、スクロールビューデリゲートメソッドをカスタムに入れ、UITableViewControllerそこから他のテーブルビューコントローラーをサブクラス化することです。ただし、実際のダウンロードはモデルで管理する必要があります。ビュー コントローラーはモデルを監視し、変更に応じて更新する必要があります。

于 2013-01-19T18:02:10.380 に答える
0

iOS 6 の新機能である埋め込みビュー コントローラーを使用して解決しました。このテーブルビューコントローラーを使用している各ビューコントローラーで、これを実行します。

self.tableViewController.tableView = self.bookTableView;
[self addChildViewController:self.tableViewController];

私のビューでは、 self.bookTableView は UITableView です。

この子 TVC からセグエを実行するには、次を使用できます。

[self.parentViewController performSegueWithIdentifier:@"Book Details" sender:selectedBook];
于 2013-01-20T13:05:21.243 に答える