このページは「iPhoneプログラミング入門」(工学社刊、ISBN 978-4-7775-1541-7)を読んで、もっと先へ進んでみたいと思った人への説明です。

次へ->
<-前へ
「次の一歩」一覧へ

最も簡単なテーブルの作り方5

テーブルを記述する二つのメソッド

UITableViewDataSourceプロトコルのメソッド

テーブルを記述するには、最低限、2つのことを記述する必要があります。 それぞれ、メソッドを用います。どちらも、「UITableViewDataSource」プロトコルで決められている名前のメソッドで、以下のような書き方をします。
-(戻り値)tableview:(UITableView *) tableView メソッド名:(引数のデータ型引数名
よくわかりませんね?そこで、本ページでは、まずこのような二つのメソッドの宣言の仕方だけハッキリさせておきましょう。

tableview:で始まるメソッド

これは、戻り値や引数を省略して書くと以下のようなメソッド名です。
tableview: メソッド名:
こういう形、見たことありませんか?「ナニナニAppDelegate.m」で「application:didホニャホニャ」という形を見ましたね。いえ、本書をひっくり返す必要はありません。今作成中の「FirstTable」プロジェクトで、「FirstTableAppDelegate.m」を見てみてください。同じメソッド名を確認できます。

このような名前の付け方は、本書では「Delegateという役割だから」と説明しておきましたが、他にも「プロトコル」のメソッド名によくあることなのです。
「プロトコル」は自分自身はクラスではなく、プロトコルで決められたメソッドは何かのクラスのオブジェクトを他から持ってきて動作します。それを持ってくる事前準備的なメソッドが「application:」 だったり「tableview:」だったりするのです。これらは文法上はメソッド名ですが、単独で使うメソッドではありません。「後から呼び出すメソッドのために、用いるテーブル・ビューの名前を決めておく」目的で使われるのです。

そのtableviewには、引数として、UITableViewクラスのオブジェクトが指定されます。その引数名がtableViewですが、「*」記号により、ポインタで指定する必要があります。
ということが以下の記述です。
tableview:(UITableView *) tableView

そのあとに、空白を置いてから、主役となるメソッドが、引数つきで記述されます。それでこんなに長くなるのです。
メソッド名:(引数のデータ型引数名

「テーブルのセルはいくつあるか」

このような「tableView:」で始まるメソッドのひとつめです。残念ながら自動記入はされていません。自分で最初から書いて行きます。
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
		
//中味もこれから自分で書く
}
「わかっちゃいるけど、長っ!」という感じですね。

メソッド名だけ書き出せば、tableView:numberOfRowsInSection:となります。
さらに、「tableView:」を除けば、numberOfRowsInSection:というのが実質的なメソッドの名前です。 名前から、「そのセクションにおける行の数」という意味だとわかりますね。
「セクション」とは、テーブルにさらに小見出しなどをつけて、いくつかのグループに分けたものを差します。今は最も簡単なテーブルですから、セクションはひとつしかありません。

で、中味はなにを書けばいいのか
それは簡単です。セルの数を数値で返せばいいのです。セルの数とは、今の場合は、"Red","Green","Blue"の3つです。

「テーブルの各セルをどのように表現するか」

「tableView:」で始まるふたつめのメソッドです。これも、最初っから自分で書きます。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
	
//中味もこれから自分で書く
}
メソッド名だけ書き出せば、tableView:cellForRowAtIndexPath: となります。 さらに、実質的なメソッド名は、cellForRowAtIndexPath: で、その引数名がindexPathです。 iPhoneでは1行がひとつのセルですから、 cellForRowとはセルのことと考えて構いません。 IndexPath(インデックス・パス)がただの「インデックス」でないのは、「2次元以上の配列」も扱えるように定義されているからですが、iPhoneでは単純にひとつのテーブルの「何番目」という情報になります。

で、中味はなにを書けばいいのか
こちらは、引数indexPathを使って表現する必要があります。
indexPathが0なら"Red", indexPathが1なら"Green"...要するに、「配列theListのindexPath番目の要素」という式を考えるのです。

これで、実装ファイルを完成させる方針が立ちました。
次は、二つのメソッドの中味を書きます