前提環境
- iOS 14.4
- Xcode 12.1 / Swift 5.3
疑問
私は、UIViewControllerのdismiss(:animated)
はシンプルに「自身を閉じる」メソッドだと思い込んでいたのですが、どうやら勘違いでした。
同じ勘違いをされている方も案外多いのでは?と考えてこの記事を書きました。
子でdismiss
を実行すると、子自身が閉じます。
これは直感通りの挙動です。
一方、Notificationやdelegateなどを介して親で親自身のViewControllerに対してdismiss
を実行すると、子が閉じて親は閉じません。
この挙動が私には意味不明でした。
わかったこと
公式リファレンスより:
calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion
訳:スタックの下位のView Controllerでこのメソッドを呼び出すと、**その直接の子ViewControllerとスタック上のその子の上のすべてのViewControllerが閉じられます。**これが発生すると、最上部のビューのみがアニメーション化されて閉じられます。
子でdismiss
を実行すると子自身が閉じることも、
親でdismiss
を実行すると子が閉じて親が閉じないことも、
dismiss
の仕様なんですね。