ListViewとナビゲーション (3/5)
作成:2011-04-04 09:06
更新:2011-04-04 09:21
更新:2011-04-04 09:21
■リストに項目を表示させてみる
では、先ほどの2つのメソッドを修正して、リストに項目を表示させてみることにしましょう。下のリスト欄に、2つのメソッドのソースコードを掲載しておきました。なんだか難しそうに見えますが、実際には★マークの2行を追記しただけです。
では、それぞれのメソッドの内容を見てみましょう。まずは、tableView:numberOfRowsInSection:です。こちらは簡単ですね。単純に、リストに用意する項目数をreturnしているだけです。今回はreturn 5;にして5個の項目を用意させることにしました(もちろん、返す値はいろいろ変更してかまいません)。
問題は、tableView:cellForRowAtIndexPath:のほうでしょう。こちらは、初期状態で色々とコードが書かれていました。それも含めて、メソッドの働きを考えていきましょう。
――このメソッドは、先に説明したように、表示するUITableViewと、そのセルが表示される場所に関するNSIndexPathというインスタンスが引数として渡されます。UITableViewで、ある場所にセルを表示する要求がされると、このメソッドに、そのUITableView自身と、表示する場所を示すNSIndexPathを引数に渡して呼び出します。
このメソッドの中で、表示するUITableViewCellインスタンスを作成してreturnすると、呼び出し元ではそれを受け取り、UITableViewのNSIndexPathで指定された場所に、返されたUITableViewCellをはめ込み表示する――ざっとそんな流れになっています。
リストに表示されるセルは、必要があるたびにいちいち新しいのを作るわけではなく、使ったものを必要に応じてまた再利用し、使い回すようになっています。それで、セルを用意する際には新たにインスタンスをallocしたりせず、このメソッドで再利用可能なセルを取り出し使うようになっているわけです。
引数には、@"Cell"というテキストを指定してありますね。まぁ、これは何でもいいんですが、IDで使い回すセルを取り出すので、毎回、同じIDが指定されるようになっていれば問題ありません。
とりあえずここでは、セルに表示するテキストを設定しておくことにします。セルには、textLabelというプロパティが用意されています。これがセルに表示するテキストを扱います(実際には、表示用にUILabelインスタンスが設定されてます)。
そこで、まず表示するメッセージをNSStringとして作成しておき、このtextLabelで得られたUILabelに、setText:でメッセージを設定します。これをreturnすれば、表示するメッセージが設定済みのUITableViewCellが返されるというわけです。
――いかがですか、リストの項目(セル)を表示する仕組みがわかりましたか? 実際にエミュレータで実行してみましょう。5つの項目が表示されたリストが現れます。ただし、これはクリックして選択しても、まだ何も起こりません。選択したときに何かを実行させるには、また別の処理が必要になります。
では、それぞれのメソッドの内容を見てみましょう。まずは、tableView:numberOfRowsInSection:です。こちらは簡単ですね。単純に、リストに用意する項目数をreturnしているだけです。今回はreturn 5;にして5個の項目を用意させることにしました(もちろん、返す値はいろいろ変更してかまいません)。
問題は、tableView:cellForRowAtIndexPath:のほうでしょう。こちらは、初期状態で色々とコードが書かれていました。それも含めて、メソッドの働きを考えていきましょう。
――このメソッドは、先に説明したように、表示するUITableViewと、そのセルが表示される場所に関するNSIndexPathというインスタンスが引数として渡されます。UITableViewで、ある場所にセルを表示する要求がされると、このメソッドに、そのUITableView自身と、表示する場所を示すNSIndexPathを引数に渡して呼び出します。
このメソッドの中で、表示するUITableViewCellインスタンスを作成してreturnすると、呼び出し元ではそれを受け取り、UITableViewのNSIndexPathで指定された場所に、返されたUITableViewCellをはめ込み表示する――ざっとそんな流れになっています。
static NSString *CellIdentifier = @"Cell";まず、UITableViewの「dequeueReusableCellWithIdentifier:」というメソッドを呼び出し、UITableViewCellを取得します。これは、待機中の再利用可能なセルをキューから取り外して取得する、ということをやっています。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
リストに表示されるセルは、必要があるたびにいちいち新しいのを作るわけではなく、使ったものを必要に応じてまた再利用し、使い回すようになっています。それで、セルを用意する際には新たにインスタンスをallocしたりせず、このメソッドで再利用可能なセルを取り出し使うようになっているわけです。
引数には、@"Cell"というテキストを指定してありますね。まぁ、これは何でもいいんですが、IDで使い回すセルを取り出すので、毎回、同じIDが指定されるようになっていれば問題ありません。
if (cell == nil) {もし、取り出したセルがnilなら(つまり、取り出せなかったら)、そのときは「まだ使い回して利用するセルができてない」ということなので、新しいUITableViewCellインスタンスを用意します。これは、allocしたのち、initWithStyle:というものでセルのスタイルを指定して初期化しています。reuseIdentifier:には、先ほどと同じIDを指定します。IDが違うと、再利用して取り出すときにうまく見つけられませんからね。
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}
NSString *msg = [NSString stringWithFormat:@"cell No,%i",indexPath.row];さて、これが新たに追加したものです。取り出した再利用可能なUITableViewCellは、まだ特に何も表示などは設定されていません。そこで、指定のNSIndexPathに表示するセルの設定などを行っておく必要があります。
[[cell textLabel] setText:msg];
とりあえずここでは、セルに表示するテキストを設定しておくことにします。セルには、textLabelというプロパティが用意されています。これがセルに表示するテキストを扱います(実際には、表示用にUILabelインスタンスが設定されてます)。
そこで、まず表示するメッセージをNSStringとして作成しておき、このtextLabelで得られたUILabelに、setText:でメッセージを設定します。これをreturnすれば、表示するメッセージが設定済みのUITableViewCellが返されるというわけです。
――いかがですか、リストの項目(セル)を表示する仕組みがわかりましたか? 実際にエミュレータで実行してみましょう。5つの項目が表示されたリストが現れます。ただし、これはクリックして選択しても、まだ何も起こりません。選択したときに何かを実行させるには、また別の処理が必要になります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※RootViewController.mで編集するメソッド - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 5; // ★項目数 } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } // Configure the cell. NSString *msg = [NSString stringWithFormat :@"cell No,%i",indexPath.row]; // ★表示テキスト [[cell textLabel] setText:msg]; // ★テキスト設定 return cell; }
※関連コンテンツ
「初心者のためのiphone/ipadプログラミング入門」に戻る