c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

UITableViewをつかえるようになってきた

テーブルを表示させるだけなら、単純に言えばInterfaceBuilderなりでUITableViewを配置して、後はdatasourceとなるメソッドを二つ実装すればよい。

以下ミニマムな実装をしてみる。ミニマム実装ってのは理解のために本当に重要だと思うね。

xibファイルのアウトレットの接続

Viewに適当にUITableViewを設置して、datasourceとDelegateをFile's Ownerに接続しておく。
これでAppControllerのクラスのメソッドを利用する様になる。
メソッドについては後述。

データの作成

大抵は配列で作るのではないか、どの例をみてもそうだった。

.h
@interface RootViewController : UITableViewController{
	NSMutableArray *listOfContents;
}

@property (nonatomic, retain) NSArray *listOfContents;

.m
@synthesize listOfContents;

- (void)viewDidLoad {
    [super viewDidLoad];
	self.listOfContents = [[NSMutableArray alloc] initWithCapacity:3];
	[listOfContents addObject: @"1"];
	[listOfContents addObject: @"2"];
	[listOfContents addObject: @"3"];
}

これは難しい所なにも無し。
viewDidLoadメソッドはViewがロードされたら呼ばれる。

numberOfSectionsInTableViewを実装

今回のサンプルではセクション分けしないので、固定値が返るように。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

この辺り使い方をまだ勉強してない。

numberOfRowsInSectionを実装

前述で生成したデータの長さが返る様に、別にハードコードしたっていい。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [listOfContents count];
}

cellForRowAtIndexPathを実装

ちょっとマジックワードが、Indentifierの本当の意義がまだわかってない。
キャッシュを制御するのにIDとしてつかってるんかな?

やってる事は単純で、引数として要素のIndexをとり、UITableViewCellを生成してそれに適切な値をつっこんで、戻している。
前述のnumberOfRowsInSectionとこれを組み合わせてデータを取得するという仕組みらしい。


途中でif(cell==nil)があるが、これは[tableView dequeueReusableCellWithIdentifier:MyIdentifier]で以前つかったcellのデータがあるのかを確認しているのではないだろうか。無い場合にはinitWithFrameで生成していると。
でも後ろのほうでtext代入して破壊しちゃってるし、よくわからん。テンプレート的なデータだけをのこしてあるってことなのか?多分そうなんだろう…多分、[cell release]してないのはそういう理由なんだと思う、多分。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *MyIdentifier = @"MyIdentifer";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    }
    
    cell.text = [listOfContents objectAtIndex:indexPath.row];
    return cell;
}

ここのあたりを色々すれば、画像をつっこんだりするテーブルもつくれるのかな?


以上、ここまでの実装で、データをUITableViewに表示する所までできる。
でもまあタップしたときになんか処理しないと話にならんよね。

didSelectRowAtIndexPathの実装

タップするとこのメソッドが実行されるので実装しておく。
まあここではmyLabelなんて物に値を渡しているけれど、意味はない、適当に実装すればよい。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	myLabel.text = @"test";
        // indexPath.row でタップされた要素の番号がとれる。
}

まとめ

よくわかってない所が多少あるけれど、テーブルを並べることはできるようになった。

まだ配列を更新したときにどういう風にすればよいのか解ってない。

ちなみにUINavigationControlも勉強したので、次はそれを書く。


UITableViewとUINavigationControlがつかえれば、ついにiPhoneっぽいUIがつくれるようになる。

じわじわ進んでるよー。