UITableView で custom cell

またはまった。UITableView で custom cell をしようとした話。

detail に tableView を配置して、内容は custom cell ってのはうまくいっているんだけど、テンプレートになる Master の cell を custom cell にするのがうまくいかなくて。こっちの方がネットに書いてあること多いんで、楽勝だろうと思ったらはまった。

UITableViewCell の custom class を作って、XIB ファイルも作ると。そこまではオッケー。次に、xib ファイルの identifier を Cell と命名。storyboard で、prototype cell があるので、そこに作成した class を指定し、ここでも identifier を Cell と命名。名前がかぶるのでおかしくならないのか心配だけど、うまくいっているのでよしとしよう。

MasterViewController の viewDidLoad で、次のように cell を定義。

    UINib *nib = [UINib nibWithNibName:@"STMasterCustomCell" bundle:nil];

    [self.tableView registerNib:nib forCellReuseIdentifier:@"Cell"];

次に、必須の method で、cell をカスタムすることを記述。

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

{

    STMasterCustomCell* cell = (STMasterCustomCell*)[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

 

cell の内容は、次の method で定義。

- (void)configureCell:(STMasterCustomCell *)cell withEvent:(Event *)event

 

ここまで出来て、ほゥほぅ、うまくいった、うはっと思ったら、セルをタップしても detail に遷移しない。う、なんでなんで?やり方わからない。調べたら、セルをタップしたときに呼ばれる method があったので、segue を呼ぶようにわざわざ指定してやるとうまくいった。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    [self performSegueWithIdentifier:@"showDetail" sender:indexPath];

}

 

ってか、なんで今までは指定する必要がなかったのに、custom cell にしたら指定しないとならなくなるわけ?あとね、わかりにくいのが、sender として指定する引数なんだけど、指定しようがないので、テキトーに indexPath としたらうまくいったのね。

custom cell を使う方法って色々書いてるところがあるけど、セルをタップしたら detail に遷移しなくなったという事例はあまり見かけないので、きっとやり方を間違えているんだろうと思うけれども、正しい方法がわからないのと、うまくいっているのでよしとしよう。