Xcode
iOS
UITableView
Swift

UITableViewでtableView:heightForRowAt:メソッドが呼ばれない!

More than 1 year has passed since last update.

tableView:heightForRowAt:メソッドが呼ばれない!

96E9FA1E-F755-4555-B9D6-FE60EED7E081.jpeg

上のスクリーンショットのように、セルの高さがことなるテーブルビューをつくるときには、下記のようにtableView:heightForRowAt:メソッドで動的に高さを変更します。

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        switch type {
        case .book:
            if books.count > 0  {
                return 150
            }
            return 60
        case .game:
            return 120
        }
    }

開発中のアプリでも動的にセルの高さを変更しようとしましたが、なぜかできませんでした。原因を調べてみると、tableView:heightForRowAt:メソッドが呼ばれていません。

アップル公式リファレンスをしっかり読みましょう

なぜメソッドが呼ばれないのか? あれこれ調べてみましたが、とても単純な理由で、tableViewのdelegateの設定をしてなかったからです。

tableView:heightForRowAt:メソッドは、名前と処理内容から想像してdataSourceのメソッドかと思い込んでいました。しかし、アップル公式ドキュメントをみてみると、バッチリ『Asks the delegate』と書いているではありませんか!

1389D925-D3BC-476E-B5EF-EA47561D4BD5.png

というわけで、UITableViewDelegateを設定すると、無事にtableView:heightForRowAt:メソッドが呼ばれるようになりました(よかったよかった)。

テーブルビューをつかうときには、dataSourceとdelegateの両方を設定する場合がほとんだと思います。ですので、今回のような事態に陥ることはあまりないでしょう(今回は、開発中だったので、まずはdataSourceだけ実装していたために発生しました)。

とはいえ、この世界のだれかが同じ悲しみの沼にハマる可能性がゼロではありませんので、この記事をしたためました。

さいごにひとこと。
アップル公式リファレンスは、しっかり読みましょう>自分。
アップル公式リファレンスと仲良くなって、目指せ楽々アプリ開発!っていう記事を書いているくらいなのに……。おはずかしい😱)