未熟学生エンジニアのブログ

TetsuFeの個人開発ブログ

TetsuFeはテツエフイー と読みます。FlutterやWeb周り全般、チーム開発について語るブログ

viewDidLoad, viewWillAppearなどの使い分けの例

はじめに

viewDidLoad, viewWillAppear, viewDidAppear, layoutSubView, ...
いろいろとありますが、どう使い分けるべきなのか、わからないやあまり知らないという方は多いのではないでしょうか?
正しいかはわかりませんが、私の使い分けの例を記していきたいと思います。もっといい方法等あれば、コメントいただけると嬉しいです。

表示されるたびにviewを更新したい

これは、普段viewDidLoadだけを使っている人が最初に当たる壁かと思います。そう、viewDidLoadは、最初にViewControllerが呼ばれたその一回目しか呼ばれません。では、何を代わりに使うのがよいか?
viewWillAppearを使いましょう。これは、viewに遷移するたびに実行されます。また、viewが表示される前に呼ばれるので、ユーザからはviewDidLoadを使った場合と違いがわかりません。

viewDidLoad, viewWillAppearだと、UIView.frameやboundsが変な値になる!

実はこれは、autolayoutを使うときに起こるようです。
この場合は、

  • viewDidAppear
  • viewDidLayoutSubviews

を使うと良いと思います。

viewDidLayoutSubviewsを使うべき場合

viewDidLoad, viewWillAppearなどで扱いたい処理の場合は、viewDidLayoutSubviewsを使うべきです。これは、先述した場合と同じく、viewが表示される前に呼ばれるためです。
ただし、viewDidLayoutSubviewsは、複数回呼ばれてしまいます。なので、一度だけしか行いたくない処理は、そのようにif文などで条件をつける必要があるので注意です。

viewDidAppearを使うべき場合

あえて一部だけ送らせて表示したいときや、その描画処理に時間がかかってしまうとき(viewDidLayoutSubviews描画が終わるまでview遷移しないので、ユーザがイライラするかもしれない)に使うとよいでしょう。
ただし、viewが表示されてしまってから処理が実行されるので、viewDidAppearの処理部分だけは遅れて表示されてしまったりして、ユーザからすると少し違和感があります。

迷った時は

迷った時は、とりあえずviewDidLoadでよいです。問題がおきてはじめて他のメソッドを試してみるとよいでしょう。

合わせて読みたい

Auto Layoutでハマったframe,bounds値の取得:Swift/iOS8 - Yukim Log