[iOS]UITableViewのStatic CellsをUIViewControllerで使いたい!
おばんです、毎朝オフトゥンが離してくれなくなる季節になったなあと感じている田中です。
今回はUITableViewのStatic CellsのTipsです。
UITableViewのStatic Cellsとは
UITableViewのStatic Cellsとは、扱うセルを静的に固定して置きたいときに使うUITableViewのコンテントモードのことです。
Storyboard上では以下の画像の箇所で変更できます。
例えばこのStatic Cellsをアプリ開発の中のどういった場面で使うかというと、
- 設定・その他画面のUITableView
- EmptyStateを表示する、UIRefreshControlを使うためのUITableView
などです。
Static CellsをUIViewControllerで扱うことはできない
Static Cellsは上述したように静的に配置するセルを扱うことのできる便利な機能なのですが、Static Cellsを扱うためにはそのUITableViewの親ViewControllerがUITableViewControllerでなければいけないという制約が存在します。 UIViewController上でStatic Cellsを扱おうとすると以下のようなエラーが発生します。
Static table views are only valid when embedded in UITableViewController instances
なぜStatic CellsをUIViewController上で扱いたいのか
UITableViewController上でStatic Cellsを扱えるのであればそのままでよいのではないかと考えるかもしれません。 しかしUITableViewControllerをそのまま使うことの問題として、レイアウトのカスタマイズ性の低さが挙げられます。
UITableViewControllerをStoryboard上で扱おうとすると、ベースとなるviewはUITableViewとなります。(UIViewControllerの場合はUIViewとなっています) また、そのベースのUITableViewはUITableViewControllerいっぱいに設置された状態であり、AutoLayoutの貼り直しが効かない状態となっています。 これは例えばUITableViewの上下左右領域に別のViewを設置したいときなどを考えると、あまりにレイアウトが組めなさすぎるという問題があります。
対応策
UITableViewController in ContainerView on UIViewController
UIViewControllerにContainerViewを配置し、そのContainerViewの中身をUITableViewControllerにすればStatic Cellsを扱うことができるようになります。
これによりStatic Cellsを使った状態でレイアウトのカスタマイズがしやすくなりました。 上の画像では例としてContainerView(UITableViewController)の上下にView要素を配置しています。 カンタン。?
まとめ
ContainerViewでUITableViewControllerを扱うとすると、また新たにUITableViewControllerのサブクラスを作らなくてはいけなくなり面倒だ。と思うかもしれませんが、UIViewController上にUITableView以外のView要素を配置するような場合だと、UITableViewの管理までをそのViewControllerで行うと役割過多である可能性も考えられます。 UIViewController上でStatic Cellsを扱うためにUITableViewを置きたいといったときに新たにUITableViewControllerのサブクラスを作るというのはむしろ役割を切り分けるという意味で健全になるかもしれません。
少し手間かもしれませんが、UITableViewを制するものはiOSを制します。良きUITableViewライフを。