Swift:別階層のViewControllerの取得

1 min read

parent(旧parentViewController)

Navigation Controller などの現在の階層の親VCを取得。

モーダル表示した場合

モーダル表示present(_:animated:completion:)とはこれまでの階層構造とは別の階層が生まれる画面遷移。なのでparentでは過去のVCは取得できない。

例えば以下のような画面の重なりになっていたとして

A: ViewController
B: NewModalViewController //A.present(_:animated:completion:)

presentingViewController

Bから見たAのこと。自分"を"提示しているVC.

presentedViewController

Aから見たBのこと。自分"が"提示しているVC

覚え方

英語の復習。このpresentingやpresentedは現在進行系や過去形ではなくbe動詞と一緒に使われる形容詞っぽい。

ingは「物や他人が自分を〇〇している」

The soccer game is exciting (to me).

edは「自分が〇〇している」

I am excited at the soccer game.
https://global-square.com/blog/exciting-excited/

発展

しかし Navigation Controller などでpush,pushと遷移したあとにpresent Modallyした時は少し複雑になるらしい。

A: TabBarController
B: NavigationController //A.addChild(B)
C: FirstNavChildViewController //B.pushViewController(_:animated:)
D: NewModalViewController //C.present(_:animated:completion:)

タブ遷移やプッシュ遷移はpresent Modallyには当たらないはずなので‥。ちょっと今は時間がないので後で検証したら追記します。詳しい方いたら回答よろしくお願いしますm(_ _)m

A.presentedVC = D?

B.presentingVC = ?
B.presentedVC = ?

C.presentingVC = ?
C.presentedVC = ?

D.preesntingVC = A?

presentとmodalの言語的な意味

present

プレゼントするのpresentだが、画面遷移的な意味合いでいうと「提示する」が一番しっくりくる。

Mode(モード、様式、形式)の形容詞。直訳で「様式的な」などの意で、上から被さるみたいな意味ではない。「現在のモードを外れて別のモードを開始する(それまで元のモードの操作はさせない)」といった意味でpresent Modally。

モーダルダイアログとは、メインコンテンツの上に表示されるダイアログで、ユーザーにインタラクションを要求する特別なモードにシステムを移行させるもののことである。このダイアログは、ユーザーがそのモーダルダイアログに明確にインタラクトするまで、メインコンテンツを無効にする。
https://u-site.jp/alertbox/modal-nonmodal-dialog

https://aryzae.hatenablog.com/entry/2016/06/13/210000
https://yamato8010.hatenablog.com/entry/2021/02/01/083000
https://your3i.hatenablog.jp/entry/2018/09/22/170455