Upload
masayuki-nii
View
632
Download
2
Embed Size (px)
DESCRIPTION
Cocoa勉強会#38 2009/12/19 UITableViewテーブル内のナビゲーション 新居雅行
Citation preview
UITableViewテーブル内のナビゲーション
Masayuki NiiCocoa勉強会 関東 第38回
2009/12/19
1
2
3
Agenda
テーブルビューのインデックスについて組み込み方法サポートクラス
注意:本日の用語• インデックス=ナビゲーションのための画面表示物• 番号=いわゆる配列のインデックス
4
テーブルビューのインデックス
5
テーブルビューのインデックス
5
オブジェクトモデル
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewUITableViewController
<UITableViewDelegate>
<UITableViewDataSource>
6
データモデル-インデックスなしArray
ObjectUITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableViewCell
UITableView
Object
Object
Object
7
インプリメント-インデックスなし
<UITableViewDataSource>の以下のメソッドを組み込めばよいnumberOfSelectionInTableView:• セクションの数を返す(定数1を返す)tableView:cellForRowAtIndexPath:• 引数で示されたセルのオブジェクトを返すtableView:numberOfRowsInSection:• セクションのセル数を返す
8
データモデル-インデックスありArray
SectionUITableViewCell
UITableViewCell
UITableViewCell
UITableView
SectionUITableViewCell
UITableViewCell
UITableViewCell
SectionUITableViewCell
UITableViewCell
UITableViewCell
Array
Object
Object
Array
Object
Object
Array
Object
Object
9
インプリメント-インデックスあり
さらに、以下のメソッドも組み込むselectionIndexTitlesForTableView:• インデックス上に見える文字列を配列で返すtableView:sectionForSectionIndexTitle:atIndex:• セクションタイトルないしはセクション番号からセクション番号を求める• 両方が引数で得られるが、自由に使ってOKtitleForHeaderInSection:• セクションヘッダに表示する文字列を返す
10
UILocalizedIndexedCollation
インデックスのサポートクラス• インデックス運用のための文字列配列を生成• テーブルビューとのやりとりのメソッドで使える• 基本的にシングルトン動作• ローカライズ対応• iPhone OS 3.0より搭載ポイント•必ずしも使わなくてもよい
11
UILocalizedIndexedCollation クラスのプロパティとメソッド
+ currentCollation インスタンス取得
– sectionForSectionIndexTitleAtIndex:インデックス番号に対応したセクション番号を返す
– sectionForObject:collationStringSelector:
オブジェクトが所属するセクション番号を返す
– sortedArrayFromArray:collationStringSelector:
配列にメソッドを適用してソートした配列を生成する
sectionTitles セクションタイトル文字列の配列sectionIndexTitles インデックスに表示する文字列の配列
12
プロパティで得られる値sectionTitles• [英語] A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, #• [日本語] A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, あ, か, さ, た, な, は, ま, や, ら, わ, #
sectionIndexTitles• [英語] A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z• [日本語] A, •, D, •, G, •, J, •, M, •, P, •, T, •, Z, あ, か, さ, た, な, は, ま, や, ら, わ
13
現実問題
UILocalizedIndexedCollationは便利そうだが…• タイトルやインデックスの文字は固定、しかも前述の通り• sortedArrayFromArray:collationStringSelector:は汎用メソッド
同様なクラス等を自分で組み込む• タイトル文字列の配列• インデックス文字列の配列• インデックス番号からセクション番号を得る• (あるいは文字列からセクション番号を得る)
14
さらに深読み
NSDictionaryよりもオブジェクト• sortedArrayFromArray:collationStringSelector:の最後は@selector(メソッド名)を指定• 配列の要素にメソッドを適用して文字列を取り出し、その文字列を比較して並べ替える
NSDictionaryの場合• カテゴリでNSDictionaryのメソッドを追加するオブジェクトの場合• プロパティ名で済む• プロパティ名はすなわちプロパティのGETメソッド
15
まとめ
テーブルビューのインデックスは、いくつかのメソッドをインプリすれば表示される• インデックス処理をサポートするUILocalizedIndexedCollationクラスははシンプルだが常に実用とは限らない• 自前で処理するとしても、前述のクラスの機能は参考にできる• データモデルに応じたデータの用意は自分でやらないといけない
16