ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

UITableViewCellがnil

備忘録。
NavigationControllerでの画面遷移で、遷移先でカスタムセルを使用する場合のケース。
こんな感じ。マスター画面へはタブで遷移するのだけれど、本題とは違うんで省略。

ちょっと試しに"(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath"で遷移させたらどうなるかなと思って以下の様な感じのコードで試してみたら、

    ListDetailController *detailViewController = [[ListDetailController alloc] initWithNibName:nil bundle:nil];
    // ↑この辺、NibNameあたりがパラメータにあるメソッドを使う事自体がダメな気がするが、今回の主題とは違うのでシカト
    [[segue detailViewController] setDetailItem:object];
    [self.navigationController pushViewController:detailViewController animated:YES];

遷移自体はして処理も普通に行っているのだけれど、"(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath"メソッド内で、以下の戻りがnilになった。

    static NSString* CellIdentifier = @"TokuCell";
    TokuCell* cell = ( TokuCell* )[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

もちろん、カスタムセルのIdentifierはセットしてある。

物は試しと以下コードを追加してみたが、カスタムセル上の画像やラベルが非表示になってしまった。要するに内容の無いセルだけが並んでいるという寂しい画面になった訳だ。

    if( cell == nil )
    {
        cell = [[TokuCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

やっぱsegueで遷移しないとだめっぽい。
んで、マスター画面で以下を実装したが、マスター画面のセルを選択してもこのメソッドが呼ばれない。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"listDetail"]) {
            [[segue destinationViewController] setDetailItem:object];

        }
    }

なんでかな〜と思ったら、こっちの方でセルのIdentifierをセットしていなかったというオチでした〜。
いやほら、マスターの画面はカスタムセル使ってなかったんで、完全に見落としてましたわ〜。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        cell.textLabel.text = @"****";
        return cell;
    }

無事にセットしたらば、ちゃんと動きましたとさ。