LoginSignup
9
4

More than 5 years have passed since last update.

UITableViewCellにUIViewControllerを入れた場合のライフサイクル(MicroViewController,Mew)

Last updated at Posted at 2019-02-21

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を安心して取り入れることができそうです。

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4