iOS

Xcode11以降で新しいUIWindowを追加する

Xcode11UIWindow

 

Xcode11以降で新しいUIWindowを追加する方法

Xcode10以下の書き方

Windowを新しく追加して、そのWindow上にUIAlertViewControllerのアラートを表示したい時に今までは以下のように書いていました。

let newWindow = UIWindow(frame: UIScreen.main.bounds) 
newWindow.rootViewController = UIViewController() 
newWindow.windowLevel = UIWindow.Level.alert + 1 
newWindow.makeKeyAndVisible() 

Xcode11以上 & UISceneを使用する時の書き方

ところが、Xcode11/iOS13からはSceneDelegateを使用するようになったため、上記の書き方では上手く動かなくなりました。
そこで以下のようにWindowを追加すると、上手く動きます。

guard let windowScene = UIApplication.shared.connectedScenes
            .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { return }
let window = UIWindow(windowScene: windowScene)
// あとは上記と同じ

これで既存のViewControllerを使用せず、新しいWindowを追加することで、モーダルやアラートを表示できます。

UIWindow関連のextension

UIWindowやkeyWindowを使用する時に、以下のようなextensionを作成すると、便利です。

extension UIApplication {
    var windowScene: UIWindowScene? {
        return connectedScenes
            .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
    }

    // keyWindowは以下のように取得できます。
    var keyWindow: UIWindow? {
        return windowScene?.windows
            .first(where: { $0.isKeyWindow })
    }
}

修正点あれば、指摘いただけると、ありがたいです。

0

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA