addChildViewControllerしてもviewWillAppearが呼ばれないことがある場合の対処方法

公開日: : 最終更新日:2017/08/25 iOSアプリ開発

こんにちは、@akio0911です。

addChildViewControllerを使ってもviewWillAppearが呼ばれないことがあったので、その場合の対処方法をメモしておこうと思います。

(どこか認識や考え方などが間違っている点などがあれば、ご指摘頂けると幸いです!)

問題が起こったコード

まず、状況によってviewWillAppearが呼ばれたり呼ばれなかったりした時のコードを以下に示します。

class ParentViewController: UIViewController {
   func displayContentController(contentVC: UIViewController) {
       addChildViewController(contentVC)
       view.addSubview(contentVC.view)
       contentVC.didMove(toParentViewController: self)
   }
}
  1. addChildViewController()を呼ぶ
  2. addSubview()を呼ぶ
  3. 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

この記事を書いた人
あきお(@akio0911
iOSエンジニア、ブロガー。「プログラミングで人々を幸せに」をテーマに活動中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。 MAMORIO株式会社 技術顧問(インタビュー記事)、VISITS Technologies株式会社 技術顧問(インタビュー記事)。ブログ「卵は世界である」を運営。

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

プログラミング未経験者向けのプログラミング入門連載記事を始めます

こんにちは、@akio0911です。 これからプログラミング未経

【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

こんにちは、@akio0911です。今回はRxSwiftのBe

【RxSwift】materialize, dematealizeを使ってみた

@toshi0383さんに教えていただいた、RxSwiftのm

【RxSwift】ストリームのcompletedをつぶす(消し去る)方法

RxSwiftで元々のストリームからcompletedをつぶす

【RxSwift】completedかerrorが流れてきたらsubscribeはdisposeされる

RxSwiftにおいて、completedかerrorが流れて

→もっと見る

PAGE TOP ↑