2009/08/17

[Objective-C][iPhone sdk]UITableViewControllerの不思議さ

改めて、iPhone sdkに関する昔に書いた日記を読んでみると、不思議なエントリーが見つかった。

以前、iPhoneに表を出力する方法として、表を作成を書きました。

その一部のソースを引用します。

 set_table *tableViewController =
[[set_table alloc] initWithStyle:UITableViewStylePlain];
tableViewController.names = [[NSArray arrayWithObjects:
@"hoge1"
, @"hoge2"
, @"hoge3"
, @"hoge4"
, @"hoge5"
, @"hoge6"
, @"hoge7"
, @"hoge8"
, @"hoge9"
, @"hoge10"
, nil
]retain];

[window addSubview:tableViewController.view];
// Override point for customization after application launch
[window makeKeyAndVisible];

で、問題となったのは、これだけしかしてないのに、なぜ、表として表示されてしまうのだろうか?(正常終了している。)


つまり、プログラムとして表のセクション数を設定する、

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView



1セクションあたりの行数を決める、

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

など、

さらに、セルにどのようなデータを表示するかを設定する

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

を直接呼び出してないのに、きちんと表が作成されている。

なぜか???

こういう仕様だからと納得してしまえば楽なのですが、なかなかそうもいかず、回答を考えてみようかなと。

リファレンスを読んでみる限り、nibファイルが存在しない場合や仮にnibファイルが存在していたとしてもdata sourceやdelegateが存在しない場合、自分自身のクラスにあるメソッドをコールしてしまうのだと。

だから、平気でprotocolにあるメソッドをオーバーライドすればいいわけだし、かつそれが実行されるというわけだ。

それではいつ実行されているのか?

initWithStyleメソッドでこれらの処理が呼び出されていない可能性がある。

なぜなら、配列(上の処理ではnames)を設定しているのが、初期化が終了した後だからだ。
(ひょっとしたら、セクションの設定、各セクションごとの行数の設定は初期化の際に行われているかもしれないが。)

リファレンスを読んでみての感想ですが、おそらくUIViewControllerに定義されているloadViewメソッドが暗黙に呼ばれた際に、上のメソッド郡が実行されているのではないかと推測される。
(UIViewControllerはUITableViewControllerクラスの親クラスなので)

ここら辺は、まだまだ勉強不足なので、経験でカバーしていきたいです。

しかし、htmlのtableタグとは難易度が雲泥の差だな。

0 コメント:

コメントを投稿