viewDidDisappearって見えなくなった時に呼ばれる訳ではない?
Androidの場合、ActivityやFragmentが画面に表示されるときにはonResume, 非表示時にonPauseなイベントが発生します。非表示というのは、文字通り画面から見えなくなったとき。他のアプリに切り替わってバックグラウンドに入った時にも、きちんとonPauseはやってきます。(onShow/onHideでよかったんじゃないかと思うのですが…)
iOSのUIViewControllerの viewWillAppear/viewDidAppearやviewWillDisappear/viewDidDisappearもてっきり同じ動作だと思っていたのですが、微妙に違うみたい?
ForeGround状態のアプリに対して、着呼などの割り込み/Homeボタン押し下げ/sleepが発生すると、applicationWillResignActiveが呼ばれ、InactiveやBackGround状態へと移行しますが、この時に表示中のViewのviewWillDisappearは呼ばれないみたい。
たしかに、View自体は依然としてWindowのTopにいるわけで、ただただApplicationの状態が変わっただけと考えると納得のいく動作ではあります。
ちなみに applicationWillResignActiveが発生した場合、以下の対応が必要だそうで、
- タイマーその他、周期的に起こるタスクを停止する。
- メタデータクエリが動作していれば停止する。
- 新たなタスクを起動しない。
- 動画の再生を停止する(AirPlay経由で再生している場合を除く)。
- アプリケーションがゲームの場合、一時停止状態にする。
- OpenGL ESのフレームレートを落とす。
- 重要なコードを実行していないディスパッチキューやオペレーションキューを停止する(ネット ワーク要求など、時間を要するバックグラウンドタスクは、非アクティブ状態でも続行可)。
applicationDidBecomeActiveでこの逆の対応。
結局ApplicationDelegateの方から、なんらかのイベントを送り込んでやらないといけないということで、ちょっと不便かも。 こーゆーときは Applicationにイベントを通知してもらうためのフックをかけるといいのかな?
OnApplicationStateChangeListener(命名規則が完全にAndroidですが)みたいなのを,viewのDidAppear/WillDisappearでApplicationにセットするのがシンプルでいいかな…