😁

view controllerのライフサイクルについてまとめてみた

2021/09/22に公開

畑田です。
今となっては当然のように判断していますが、コードでiOSアプリを作る時に絡んでくるview controllerのライフサイクル(生活環)についてメモしておきます。

loadView()

基本的にoverrideして再定義するべきではないし、view controller classがインスタンス化されて終わっていないタイミングだから、selfが取れないです。
だからここにUIを司るviewとかを書いても嬉しくないというわけです。

viewDidLoad()

これは、view controller classの新しいファイルを生成するとXcodeが自動でoverrideを書き込んでくれるやつです。
ここでUIを設定してあげるのがおすすめだと考えられます。
view controllerのインスタンス化も済んでいるので、selfも取れるし、propertyもインスタンス化できるので、self.viewとかも自由自在というわけです。

viewWillAppear(), viewDidAppear()

その名の通り、件のview controllerが画面上に現れる(現れた)たびに呼ばれます。swipeで戻ったときとかも。
ここでしか実装できないこともありますね。画面が表示されるたびにタイムラインを更新したいとか、表示されていることを認識したい場合とか。
viewDidLoad()だとインスタンス化されたその時一回だけしか呼ばれないですからね。

viewWillLayoutSubviews(), viewDidLayoutSubviews()

これは画面をレイアウトする必要があるとiOSが認識した時に呼ばれます。つまりは初めにloadView()でインスタンス化した後、UI partsを並べなきゃいけないときと、画面の向きが変わって表示を縦横変えなきゃいけないときです。
画面の回転を許すようなアプリケーションを作るときはここにレイアウトの処理だけを置いておくと賢いです。
またこの関数の中ではsafe areaを取得できるので、画面の端にuser interactionのあるUI partsをおくときはここにその設定を書くのが良さそうですね。
ただし、ここにUI partsのインスタンス化(button = UIButton(frame: CGRect()))みたいなのをかくと、画面が呼ばれるたびにそのインスタンスが生成されてメモリがどんどん食われる上、viewの上にUI partsを配置するコード(self.view.addSubview(button))を書くとすでに置かれているパーツの上にどんどんUI partsが重ねられてしまいます。
この中にはlayoutに関する設定だけを書くのが吉です!

Discussion