iOS
SDK
Swift

現在表示されているViewControllerを取得する方法

背景

iOSアプリ向けのSDKを開発する場合、アプリの画面上にポップアップやダイアログ等のViewを表示したい場合があります。その場合、現在表示されているViewControllerにviewをaddSubViewする方法が考えられますが、SDK開発の場合はアプリ側の実装を知ることができないため、ViewControllerにアクセスするためにやや特殊な手法を用いる必要があります。

手法

下記のようにUIApplicationからrootViewControllerにアクセスすることで、現在表示されているViewControllerを取得することができます。

func getTopViewController() -> UIViewController? {
    if let rootViewController = UIApplication.shared.keyWindow?.rootViewController {
        var topViewControlelr: UIViewController = rootViewController

        while let presentedViewController = topViewControlelr.presentedViewController {
            topViewControlelr = presentedViewController
        }

        return topViewControlelr
    } else {
        return nil
    }
}

ViewControllerを取得したら、下記のようにaddSubViewすることで画面上に任意のViewを表示させることができるでしょう。

if let topViewController: UIViewController = getTopViewController() {
    topViewController.view.addSubview(customView)
}