UITableViewとその元のUITableViewCellの機能は豊富かつ強力で、殆どの場合にはそのままで使用出来ると思います。しかし表示の仕方をカスタマイズしようとすると限界にが出てきます。
UITableViewは2次元(sessionを含めると)のテーブルを管理しますが、それぞれのセルの表示を担当しているのがUITableViewCellクラスです。
これをサブクラス化すれば表示できる項目もカスタマイズ出来ます。
全てをObjective-Cのソースで書く事も出来ますが、Interface Builderを使わない手はありません。
まずはUITabeleViewCellのサブクラスを作成します。ここでは単純にTableViewCellクラスとします。
次にUIViewベースのxibを作成します。
xcode上でviewを選択肢、クラス名を先ほど作成したTableViewCellに変更します。
次にUITableViewControllerまたはUITableViewControllerのサブクラスと関係付けてやります。
このように、File’s OwnerのクラスをUITableViewControllerまたはUITableViewのサブクラスに指定してやります。
その中には、新しいセルのクラスを IBOulet で定義してやります。
#import
#import "TableViewCell.h"
@interface TableViewController : UITableViewController
@property (nonatomic, assign) IBOutlet TableViewCell* tableViewCell;
@end
このようにInterface Builderを使うとセルとテーブルを関連づけてしまうため、再利用が面倒ですが、コードを書く手間は格段に減ります。
ではUITableViewの中でどのようにして新しいセルを作ってやるかというと、テンプレートとして作成された以下のメソッドに実装を付け加えてやります。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
TableViewCell *cell = (TableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
cell = tableViewCell;
}
tableViewCell = nil;
cell.label.text = @"Label";
return cell;
}
面白いのはloadNibNameでロードして来ていますが、返り値がありません。
これが先ほどIBOutletで指定した場所(TableViewCell* tableViewCell)に自動的に入ってくるわけです。
さて、上のコードでは
tableViewCell = nil;
としているだけですが、メモリーリークは?と思いますが、これはretainではなく、assignで定義されていますので明示的な releaseは要りません。
基本はコレだけです。
Interface Builderで作成したUITableViewCellのサブクラスは、当然UIViewクラスのサブクラスですので、そこに貼付けられるものは大概貼付けられます。
今日はここまで。
次回は、この方法でセルを作った場合に気付いた事…
を書いてみようと思います。
Leave a Reply