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

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

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

FirstTableViewControllerクラスを「テーブル用」に改変

「テーブル」を記述するのは「プロトコル」

さて、今、NIBファイルでTableViewオブジェクトを配置したけど、TableViewがあるならTableViewControllerもあるんじゃないの?...と思った人は、iPhoneアプリケーションの構造にだいぶ詳しくなったと言えるでしょう。
実は、TableViewは、TableViewDelegateというもので動くのです。
正確には、 TableViewはインターフェイス・ビルダー上の名前で、プログラム中ではUITableViewクラスのオブジェクト。それが、UITableViewDelegateというもので記述します。
「もの」とは「クラス」ではありません。「プロトコル」です。「クラス」よりも自由なキマリ、「メソッドの名前だけは決めておいてやるから、その名前でメソッドを作って中味は自分で決め(実装し)ろ」というのがプロトコル。本書では「UIApplicationDelegate」プロトコルを確認しましたね。同様に、「UITableViewDelegate」はテーブルを記述するためのプロトコルです。やっぱり、名前に「Delegate」がついています。

テーブルのプロトコルを実装する「FirstTableViewController」

そして、「FirstTableViewController」クラスがこのプロトコルを使います。
「使う」とは?...
ヘッダ・ファイル「FirstTableViewController.h」を開いてみましょう。クラス宣言はリスト1のようになっていますね。
リスト1 ヘッダ・ファイル「FirstTableViewController.h」のクラス宣言(新規作成当時)
@interface FirstTableViewController : UIViewController

リスト1のように、クラスFirstTableViewControllerはUIViewController クラスを継承する、という宣言がすでに書かれています。ここまでは、「普通のビュー・コントローラ」です。
これに「UITableViewDelegateプロトコルを使う(実装する)」宣言をくっつけます。 「<>」で囲み、リスト2のように書きます。
リスト2 UITableViewDelegateプロトコルの実装宣言
@interface FirstTableViewController : UIViewController <UITableViewDelegate>

これで、FirstTableViewControllerは、「テーブルを扱うビュー・コントローラ」になりました。

データのプロトコルも実装

しかし、これではまだ「テーブル」として実質的な働きはしてくれません。
よく、トンチまたは屁理屈で「ナニナニをやるとは言ったが、ナニナニの中味までやるとは言っていない」というオチがありますね。似たような話です。「UITableViewDelegate」はテーブルの外観と機能を扱いますが、テーブルの中味までは扱わないのです。それを扱うのが、UITableViewDataSource」というプロトコルです。 そこで、リスト2にさらに書き加え、リスト3でようやくFirstTableViewControllerクラスは真に「テーブルを扱うビュー・コントローラ」になるのです。
リスト3 二つのプロトコル実装宣言を追記した
@interface FirstTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

実は、TableViewControllerというクラスもあります

UIViewControllerクラスを継承し、かつUITableViewDelegateプロトコルとUITableViewDataSourceプロトコルを実装すれば、テーブルを扱うビュー・コントローラになる。だったら、最初っからそういうクラスがあれば、さらにそれを継承した自分のビュー・コントローラを作れるじゃないか...
ハイ、実はあります。その名もズバリ「UITableViewController」。Appleの技術文書にもちゃんと出ています。
UITableViewControllerクラス
http://developer.apple.com/iphone/library/documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

では、なぜ今それを素直に使わないかというと、これら2つのプロトコルをちゃんと意識してもらいたかったからです。というのは3/4くらいウソで、ホントの理由は、Xcodeに「Table-based Application」みたいに「テーブル(だけ)を簡単に実現できる」テンプレートがなかったからです。宣言部分のタイピングの量がちょっと多かったというだけで、あとは同じです。具体的な中身をこれから書いていかなければならないというのも、結局は同じです。

プロパティtheTableViewの作成

最後の作業です。で、インターフェイス・ビルダーでTableViewオブジェクトを作りましたね。あれと結びつけるために、こちらでプロパティtheTableViewを作成しておきます。 theTableViewは、UITableViewクラスのオブジェクトとして作成します。 主な注意点は、以下の二つです。 このようにしてできたリスト4は、同時に現時点での「FirstTableViewController.h」ファイルの全文でもあります。
リスト4 FirstTableViewController.h 現時点での全文
#import <UIKit/UIKit.h>

@interface FirstTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
	UITableView *theTableView;	
}

@property(nonatomic, retain)
	 IBOutlet UITableView *theTableView;
@end
FirstTableViewController.hを保存します。
次は実装ファイルを編集します