[iOS]UITableViewのStatic CellsをUIViewControllerで使いたい!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おばんです、毎朝オフトゥンが離してくれなくなる季節になったなあと感じている田中です。

今回はUITableViewのStatic CellsのTipsです。

UITableViewのStatic Cellsとは

UITableViewのStatic Cellsとは、扱うセルを静的に固定して置きたいときに使うUITableViewのコンテントモードのことです。

Storyboard上では以下の画像の箇所で変更できます。

Main_storyboard_—_Edited

例えばこのStatic Cellsをアプリ開発の中のどういった場面で使うかというと、

  • 設定・その他画面のUITableView
  • EmptyStateを表示する、UIRefreshControlを使うためのUITableView

IMG_5277 IMG_5278

などです。

Static CellsをUIViewControllerで扱うことはできない

Static Cellsは上述したように静的に配置するセルを扱うことのできる便利な機能なのですが、Static Cellsを扱うためにはそのUITableViewの親ViewControllerがUITableViewControllerでなければいけないという制約が存在します。
UIViewController上でStatic Cellsを扱おうとすると以下のようなエラーが発生します。

Static table views are only valid when embedded in UITableViewController instances

スクリーンショット_2016-11-09_14_25_53_のコピー

なぜStatic CellsをUIViewController上で扱いたいのか

UITableViewController上でStatic Cellsを扱えるのであればそのままでよいのではないかと考えるかもしれません。 しかしUITableViewControllerをそのまま使うことの問題として、レイアウトのカスタマイズ性の低さが挙げられます。

UITableViewControllerをStoryboard上で扱おうとすると、ベースとなるviewはUITableViewとなります。(UIViewControllerの場合はUIViewとなっています)
また、そのベースのUITableViewはUITableViewControllerいっぱいに設置された状態であり、AutoLayoutの貼り直しが効かない状態となっています。
これは例えばUITableViewの上下左右領域に別のViewを設置したいときなどを考えると、あまりにレイアウトが組めなさすぎるという問題があります。

スクリーンショット_2016-11-09_14_29_57

対応策

UITableViewController in ContainerView on UIViewController

UIViewControllerにContainerViewを配置し、そのContainerViewの中身をUITableViewControllerにすればStatic Cellsを扱うことができるようになります。

スクリーンショット 2016-11-09 15.26.34

これによりStatic Cellsを使った状態でレイアウトのカスタマイズがしやすくなりました。
上の画像では例としてContainerView(UITableViewController)の上下にView要素を配置しています。
カンタン。?

まとめ

ContainerViewでUITableViewControllerを扱うとすると、また新たにUITableViewControllerのサブクラスを作らなくてはいけなくなり面倒だ。と思うかもしれませんが、UIViewController上にUITableView以外のView要素を配置するような場合だと、UITableViewの管理までをそのViewControllerで行うと役割過多である可能性も考えられます。
UIViewController上でStatic Cellsを扱うためにUITableViewを置きたいといったときに新たにUITableViewControllerのサブクラスを作るというのはむしろ役割を切り分けるという意味で健全になるかもしれません。

少し手間かもしれませんが、UITableViewを制するものはiOSを制します。良きUITableViewライフを。