17
UITableView テーブル内のナビゲーション Masayuki Nii Cocoa勉強会 関東 第38回 2009/12/19 1

Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

Embed Size (px)

DESCRIPTION

Cocoa勉強会#38 2009/12/19 UITableViewテーブル内のナビゲーション 新居雅行

Citation preview

Page 1: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

UITableViewテーブル内のナビゲーション

Masayuki NiiCocoa勉強会 関東 第38回

2009/12/19

1

Page 2: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

2

Page 3: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

3

Page 4: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

Agenda

テーブルビューのインデックスについて組み込み方法サポートクラス

注意:本日の用語• インデックス=ナビゲーションのための画面表示物• 番号=いわゆる配列のインデックス

4

Page 5: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

テーブルビューのインデックス

5

Page 6: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

テーブルビューのインデックス

5

Page 7: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

オブジェクトモデル

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewUITableViewController

<UITableViewDelegate>

<UITableViewDataSource>

6

Page 8: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

データモデル-インデックスなしArray

ObjectUITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableViewCell

UITableView

Object

Object

Object

7

Page 9: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

インプリメント-インデックスなし

<UITableViewDataSource>の以下のメソッドを組み込めばよいnumberOfSelectionInTableView:• セクションの数を返す(定数1を返す)tableView:cellForRowAtIndexPath:• 引数で示されたセルのオブジェクトを返すtableView:numberOfRowsInSection:• セクションのセル数を返す

8

Page 10: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

データモデル-インデックスありArray

SectionUITableViewCell

UITableViewCell

UITableViewCell

UITableView

SectionUITableViewCell

UITableViewCell

UITableViewCell

SectionUITableViewCell

UITableViewCell

UITableViewCell

Array

Object

Object

Array

Object

Object

Array

Object

Object

9

Page 11: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

インプリメント-インデックスあり

さらに、以下のメソッドも組み込むselectionIndexTitlesForTableView:• インデックス上に見える文字列を配列で返すtableView:sectionForSectionIndexTitle:atIndex:• セクションタイトルないしはセクション番号からセクション番号を求める• 両方が引数で得られるが、自由に使ってOKtitleForHeaderInSection:• セクションヘッダに表示する文字列を返す

10

Page 12: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

UILocalizedIndexedCollation

インデックスのサポートクラス• インデックス運用のための文字列配列を生成• テーブルビューとのやりとりのメソッドで使える• 基本的にシングルトン動作• ローカライズ対応• iPhone OS 3.0より搭載ポイント•必ずしも使わなくてもよい

11

Page 13: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

UILocalizedIndexedCollation クラスのプロパティとメソッド

+ currentCollation インスタンス取得

– sectionForSectionIndexTitleAtIndex:インデックス番号に対応したセクション番号を返す

– sectionForObject:collationStringSelector:

オブジェクトが所属するセクション番号を返す

– sortedArrayFromArray:collationStringSelector:

配列にメソッドを適用してソートした配列を生成する

sectionTitles セクションタイトル文字列の配列sectionIndexTitles インデックスに表示する文字列の配列

12

Page 14: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

プロパティで得られる値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

Page 15: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

現実問題

UILocalizedIndexedCollationは便利そうだが…• タイトルやインデックスの文字は固定、しかも前述の通り• sortedArrayFromArray:collationStringSelector:は汎用メソッド

同様なクラス等を自分で組み込む• タイトル文字列の配列• インデックス文字列の配列• インデックス番号からセクション番号を得る• (あるいは文字列からセクション番号を得る)

14

Page 16: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

さらに深読み

NSDictionaryよりもオブジェクト• sortedArrayFromArray:collationStringSelector:の最後は@selector(メソッド名)を指定• 配列の要素にメソッドを適用して文字列を取り出し、その文字列を比較して並べ替える

NSDictionaryの場合• カテゴリでNSDictionaryのメソッドを追加するオブジェクトの場合• プロパティ名で済む• プロパティ名はすなわちプロパティのGETメソッド

15

Page 17: Cocoa勉強会#38-UITableViewテーブル内のナビゲーション

まとめ

テーブルビューのインデックスは、いくつかのメソッドをインプリすれば表示される• インデックス処理をサポートするUILocalizedIndexedCollationクラスははシンプルだが常に実用とは限らない• 自前で処理するとしても、前述のクラスの機能は参考にできる• データモデルに応じたデータの用意は自分でやらないといけない

16