面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

ViewControllerのpresentedViewControllerを辿る際の落とし穴

iOSのプログラムを書いている際、最前面に表示されているViewControllerを取得したいと思うことがある。
この時、rootViewControllerからpresentedViewControllerがnilになるまで取得して、
最前面のViewControllerを求めることを少なからずやったことだと思う。

ただ、これには落とし穴がある。
UISplitViewControllerとUINavigationControllerを使用しているときは、
これらの前面にModal表示している画面しか取得できず、
UISplitViewControllerのMasterやDetail、UINavigationControllerのchildは取得できない。
これらを取得したいときはClassの型を見て処理を分ける必要がある。


私が遭遇した例では、最前面にUIAlertControllerが表示されているかを確認したいという要件だった。
UIAlertControllerは、UISplitViewControllerやUINavigationControllerが表示されていようが、
それらのMasterやDetail、ChildがUIAlertControllerをpresentしていても、
UISplitViewControllerやUINavigationControllerのpresentedViewControllerとして取得できることを確認した。


最前面取ればいいんだろ〜ってことで迂闊にpresentedViewControllerだけ辿ればいいわけじゃないことをテスト検証して知ったので備忘録として残しておく。