[Swift][iOS]1つのViewに複数のTableViewとCollectionViewを入れる

1つのViewに、同じ構成のTableViewとCollectionViewを交互に入れようと思ったとき
  • TableViewとCollectionViewはそれぞれ同じ構成を繰り返すので、複数定義したくない
  • TableViewとCollectionViewの組み合わせのViewを作って繰り返すのも考えたが、同じデータソースから取得したデータを上から順に当てていかなければいけないため、親のViewControllerがやるにはちょっとめんどくさい
ということがあり、どうやればいいんだっけ?とちょっと悩んだのでメモ。

Viewの構成

前段で書いたとおり、TableViewとCollectionViewを繰り返し設置している。
*2個目のViewとStackViewは無視


今回、TableViewは3行、CollectionViewは3列1行で、交互に積み上がっている。

やったこと

やったことはシンプルで、
  1. TableView, CollectionViewに上から順番にtagを設定
  2. データを普通のTableViewと同様にIndexから取得しようとすると、積んだViewの文だけrowがずれるので、ずれた分を調整する
の2点である。

1. TableView, CollectionViewにtagを設定

TableViewを選択してXcode右側のInspectorを見ると、Viewの中にTagという項目がある(CollectionViewも同様)。
この数字を上から0始まりで設定する。今回はTableViewとCollectionView合わせて5個なので、0~5まで採番する。


こうしておくと、
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.tag
    ...
}
などして、何番目のViewかがわかる。

2. ずれたrowを調整する

今回はたまたまTableViewもCollectionViewも3つずつだったので、
tag * 3 + row
でずれた分のrowを調整できる。
普段呼ぶtableView()系のメソッドでIndex.rowを使っていると思うが、ここを
tableView.tag * 3 + index.row
のように変換してあげるだけで良い。

TableViewとCollectionViewで保持する個数が変わる、という場合も、奇数/偶数tagで計算を変えるなどすれば対応可能と思う。

まとめ

今回はTableViewとCollectionViewで単一の動きをするので、なるべく処理を増やしたくなかった。
初めてtagの存在を知ったが、複雑なViewを組み立てるケースでもそこそこ使い勝手が良い気がする。

コメント