まーたStoryboardとAutoLayoutに蹂躙された;;
心の師匠からは全部コードで書いた方がいいって再三言われているけれど、素直じゃない自分で自業自得案件。
大したことしてないのに最低限のことしかしていないつもりなのに、UICollectionViewControllerの呼び出しが悪いのか、なんだかんだで右往左往。
やりたかったこととしては、UIContainerViewのEmbed Segue経由でUICollectionViewControllerを紐づけて、親のViewでの操作に合わせてUICollectionViewControllerの中身を変更したいという実装。
UIViewController → UIViewContainer → (Embed Segue) → UICollectionViewController → UICollectionView → UICollectionViewCell
という階層構造のつもりでStoryboard使ってペタペタしてたまでは良かったけど、いざ実行してみるとnumberOfItemsInSectionで返した値分のCellがそもそも表示されない。結果的な回答への道筋は一番下の参考にしたサイトにあります。
import UIKit
private let reuseIdentifier = "collectionCell"
class MyCollectionViewController: UICollectionViewController {
var items: Array<String> = []
override func viewDidLoad() {
super.viewDidLoad()
// Register cell classes
//self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
// Do any additional setup after loading the view.
self.items = []
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.items.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
// Configure the cell
print("debug")
return cell
}
}
一部省略。
親から文字列Arrayのitemsの値を更新して、UIContainerView内のUICollectionViewControllerのCellを動的に変更するというか。
print(“debug”)は指定された個数分出力されるけどUI上でCellが見えない。
最終的には以下のXcodeで生成された1行をコメントアウトして解決。
//self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
前提として、Main.storyboardで貼り付けたUICollectionViewControllerのUICollectionViewCellのAttributes InspectorからCollection Reusable ViewのIdentifierを自前で紐付ける。
上記コードで言うとprivate let reuseIdentifierで指定する値(Xcodeで生成されたコード)を変更。
逆に言うと自前でひもづけたのがダメだったのかもしれないけど・・・。
Xcode registerClassでググればいくつか出てくるのね・・・;
ちなみに親からUIContainerView内にEmbed Segueで紐付けたUICollectionViewController内のメンバの値変更時にCellをリフレッシュするのは以下だった。なんか基本的な理解が足りず違う気がしないでもない。
if let collectionViewController = self.childViewControllers[0] as? MyCollectionViewController {
collectionViewController.items = parentArrayItems
collectionViewController.collectionView?.reloadData()
}
とりあえず動いたから後でリファクタリングしよう・・・;