Mewなどを用いてMicroViewControllerの設計思想でUITableViewを使った場合、Cellの中にはUIViewControllerを入れることになるかと思います。
そのUIViewContollerにおいて UIViewController.viewDidLoad()
などのライフサイクルはどのようになるかを確かめてみました。
以下、サンプルコードです。ライフサイクルのイベントにprint文を仕込み、実際に動かしてみて確認していきます。
final class TableViewCellViewController: UIViewController {
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
print("Notifies: viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("Notifies: viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("Notifies: viewDidAppear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("Notifies: viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("Notifies: viewDidDisappear")
}
初回の画面表示時
Notifies: viewDidLoad
Notifies: viewWillAppear
Notifies: viewDidLoad
Notifies: viewWillAppear
Notifies: viewDidLoad
Notifies: viewWillAppear
Notifies: viewDidLoad
Notifies: viewWillAppear
Notifies: viewDidAppear
Notifies: viewDidAppear
Notifies: viewDidAppear
Notifies: viewDidAppear
TableView領域に応じて必要な分のCellが生成され、各TableViewCellViewControllerが viewDidLoad, viewWillAppear, viewDidAppearの順でライフサイクルイベントが呼び出されています。
TabelViewのスクロール時
特にViewControllerのイベントは発火しないです。
画面から消える/表示されるタイミングでdisapper/appearなど呼び出されるかなと勘違いしそうです。しかしTableViewのCellは初回表示時に生成したセルを再利用するので、そのようなことはないです。
別画面へ遷移時
Notifies: viewWillDisappear
Notifies: viewWillDisappear
Notifies: viewWillDisappear
Notifies: viewWillDisappear
Notifies: viewDidDisappear
Notifies: viewDidDisappear
Notifies: viewDidDisappear
Notifies: viewDidDisappear
各TableViewCellViewControllerが viewWillDisappear, viewDidDisappearの順でライフサイクルイベントが呼び出されています。
別画面から戻って来た時(再表示時)
Notifies: viewWillAppear
Notifies: viewWillAppear
Notifies: viewWillAppear
Notifies: viewWillAppear
Notifies: viewDidAppear
Notifies: viewDidAppear
Notifies: viewDidAppear
Notifies: viewDidAppear
初回表示時とは違い、Cellは生成済みなので、viewDidLoadは呼び出されずviewWillAppear -> viewDidAppearの順でライフサイクルイベントが呼び出されています。
まとめ
UITableViewCellにUIViewControllerを入れた場合においても、概ね期待通りに各UIViewControllerのライフサイクルは呼び出されていたかと思います。
MicroViewControllerを安心して取り入れることができそうです。