addChildViewControllerしてもviewWillAppearが呼ばれないことがある場合の対処方法
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
こんにちは、@akio0911です。
addChildViewControllerを使ってもviewWillAppearが呼ばれないことがあったので、その場合の対処方法をメモしておこうと思います。
(どこか認識や考え方などが間違っている点などがあれば、ご指摘頂けると幸いです!)
問題が起こったコード
まず、状況によってviewWillAppearが呼ばれたり呼ばれなかったりした時のコードを以下に示します。
class ParentViewController: UIViewController { func displayContentController(contentVC: UIViewController) { addChildViewController(contentVC) view.addSubview(contentVC.view) contentVC.didMove(toParentViewController: self) } }
- addChildViewController()を呼ぶ
- addSubview()を呼ぶ
- didMove(toParentViewController:)を呼ぶ
という順番ですね。以下のアップルのドキュメントにも記載されているやり方です。
View Controller Programming Guide for iOS: Implementing a Container View Controller
しかし、この順番だと子ViewControllerのviewWillAppearが呼ばれないことがありました。
(常に呼ばれないわけではないのが困り物・・・)
viewWillAppear呼ばれない問題が発生しなくなったコード
問題が解決したコードを以下に示します。
class ParentViewController: UIViewController { func displayContentController(contentVC: UIViewController) { view.addSubview(contentVC.view) addChildViewController(contentVC) contentVC.didMove(toParentViewController: self) } }
なんと、addSubviewとaddChildViewControllerの順番を入れ替えただけです!
しかしこれで「viewWillAppearが呼ばれないことがある問題」が解消しました。
Stack Overflowでも、同様の解決法をコメントしている方がいました。
I encounter -viewWillAppear: not called problem again. After googling, I came here. I did some tests, and find out that the calling order of -addSubview and -addChildViewController: is important.
ios – UIViewController viewWillAppear not called when adding as subView – Stack Overflow
@akio0911はこう思った。
もしかしたら他の要因も絡んでこの現象が起きたのか?あるいはAPIのバグなのか?
どちらにせよ、子ViewControllerを追加する際には、addSubviewとaddChildViewControllerを呼び出す順番は気を付けておいたほうが良さそうです。
by @akio0911


関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!