またはまった。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 に遷移しなくなったという事例はあまり見かけないので、きっとやり方を間違えているんだろうと思うけれども、正しい方法がわからないのと、うまくいっているのでよしとしよう。