今回は、テーブルビュー(UITableView)に必要とされるデータソース(dataSource)とデリゲート(delegate)のメソッドについて解説します。これらの仕組みは、Mac OS XのNSTableViewを使う時と似ていますが、iPhone OS独自の仕組みも沢山見受けられますので、そちらも含めて話を進めたいと思います。
データソースには、UITableViewDataSourceプロトコルに準拠したメソッドを実装します。またデリゲートには、UITableViewDelegateプロトコルに準拠したメソッドを実装します。Interface Builderでテーブルビュー(UITableView)のdataSourceとdelegateアウトレットを「File's Owner」(UITableViewControllerのサブクラスであるRootViewController)に接続したことを思い出してください。よって、両プロトコルに準拠したメソッドはRootViewControllerクラスに実装することになります。
まずはデータソースからです。UITableViewDataSourceプロトコルには、全部で11のメソッドが用意されています。これらのメソッドは、UITableViewに内容を表示するために必要となるデータを提供します。このうち、絶対に実装しなければいけないメソッド(必須)が2つ、実装しなければデフォルト値が使われるメソッド( オプション)が9つ定義されています。
・データソースの必須メソッド(2)
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section;
指定セクション(テーブルの表示グループ)内のデータ配列数を返す。つまりテーブル表示が何行あるのかを返します。何も表示されていなければゼロを返します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
テーブルビューは、表示内容(文字列や画像)を配置したUITableViewCell(UIViewのサブクラス)が順番に並びます。指示された行番号( indexPath.rowで参照)に対して、そこに表示すべきUITableViewCellオブジェクトを返してやります。
・データソースのオプションメソッド(9つ)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
セクション数(テーブル表示のグループ分け数)を返します(デフォルトは1)。
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
指定セクションに表示したいヘッダータイトル(文字列)を返します。
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
指定セクションに表示したいフッタータイトル( 文字列) を返します。
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
テーブルビューの右側に表示されるインデックス(A,B,Cなどの索引)の文字列を含んだ配列を返します。インデックスを使わない場合には実装しません。
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
インデックス(索引)に対応するテーブルのセクション番号を返します(Bは1とか)。
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
行の挿入や削除に用います。 行が編集可能かどうかの判断(YESかNO)を返します。NOだと(+)や(ー)マークは表示されません。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
挿入や削除 などの行の編集が行われた場合に呼ばれます。実際の編集処理を、このメソッド内に記述します。どのような種類の編集かはeditingStyleで判断します。
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
行の順番の入れ換えに用います。行が移動できるかどうの判断(YESかNO)を返します。YESを返すとテーブル編集時に行の右側に移動用タップエリアが表示されます。
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *) sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
行の順番の入れ換えに用います。 行が移動させられた時の実際の処理を、このメソッド内に記述します。
続いてデリゲートです。UITableViewDelegateプロトコルには全部で19のメソッドが用意されています。デリゲートの方には必須は無くすべてがオプションですが、iPhone OS 3.0で新規に追加されたメソッドが3つ、廃止(Deprecated)されたメソッドが1つ含まれています。
・デリゲートのオプションメソッド(19)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
その行番号(indexPath.row)の行の高さを指示する(デフォルトは44ピクセル)。
- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;
行のインデンテーションレベルを返す(グループタイプのテーブルビューのみに有効)。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
行に表示するセル( UITableViewCell )内容をカスタマイズすることが可能。このメソッドはセル描画時に呼ばれる。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath;
アクセサリー(行右側の小さなボタン)がタップされた時の処理を実装する。
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath;
行の右側に表示されるアクセサリーのタイプ(>など)を指示する。iPhone OS 3.0で廃止(Deprecated)された。
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
行の選択(行をタップ)開始時に実行する処理を実装する。nilを返すと選択拒否となる。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
行の選択(行をタップ)終了時に実行する処理を実装する。
- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath;
行の選択解除(別の行をタップ)開始時に実行する処理を実装する(セレクション開始)。 nilを返すと選択解除拒否となる。 iPhoen OS 3.0から利用可能。
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath;
行の選択解除( 別の行をタップ)終了時に実行する処理を実装する(セレクション開始)。iPhoen OS 3.0から利用可能。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
セクションヘッダーに配置するカスタムビュー(UIView)を指示する。
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
セクションフッターに配置するカスタムビュー(UIView)を指示する。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
セクションへッダーの高さを指示する(デフォルトは24ピクセル)
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
セクションフッターの高さを指示する(デフォルトは24ピクセル)
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
編集開始時に呼ばれる(例えばナビゲーションバーの編集ボタンをタップした時)。
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;
編集終了時に呼ばれる。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
追加や削除などの編集スタイルを返す。これにより編集時に行の左側に(+)や(ー)などのマークが表示される。
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath;
編集時に行の右側に表示される赤い「削除」ボタンの文字列内容を変更する。iPhoen OS 3.0から利用可能。
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;
編集時に行をインデントさせ(+)や(ー)マークを外に表示させるかどうか判断する。グループタイプのテーブルビューのみに有効(デフォルトはYES)。
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;
編集モードで行の移動や並び替えを実行した場合に呼ばれる。必要ならば、実際のモデルオブジェクトの順序入れ換えをここで実行する。
iPhone OS 3.0で廃止されたtableView:accessoryTypeForRowWithIndexPath:メソッドを使っていたアクセサリータイプの変更は、UITableViewCellのaccessoryTypeプロパティで指示するよう推奨されています。また、iPhone OS 3.0になり、行の選択解除時に呼び出されるデリゲートメソッドが追加されているのですが、UITavleViewのヒューマンインターフェースガイドラインによると、テーブル行の選択状態はそのまま残しておいてはいけないはずでした。なぜ追加されたのでしょうか?サブクラス対策でしょうか?
次回は、本アプリのビューコントローラー(RootViewController)に、必要とされるデータソースとデリゲートメソッドの実装を行います。テーブルビューに表示する内容は、モデル(Model)オブジェクトに登録されていいる画像ファイルの名称やサムネイルとなる予定です。