1つのViewに、同じ構成のTableViewとCollectionViewを交互に入れようと思ったとき
- TableViewとCollectionViewはそれぞれ同じ構成を繰り返すので、複数定義したくない
- TableViewとCollectionViewの組み合わせのViewを作って繰り返すのも考えたが、同じデータソースから取得したデータを上から順に当てていかなければいけないため、親のViewControllerがやるにはちょっとめんどくさい
ということがあり、どうやればいいんだっけ?とちょっと悩んだのでメモ。
Viewの構成
前段で書いたとおり、TableViewとCollectionViewを繰り返し設置している。
*2個目のViewとStackViewは無視
*2個目のViewとStackViewは無視
今回、TableViewは3行、CollectionViewは3列1行で、交互に積み上がっている。
やったこと
やったことはシンプルで、
- TableView, CollectionViewに上から順番にtagを設定
- データを普通の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を組み立てるケースでもそこそこ使い勝手が良い気がする。
コメント
コメントを投稿