5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SwiftUI】SwiftUI Appで`window.rootViewController`を用いた初期画面の表示

Posted at

はじめに

アプリの初期画面をwindow.rootViewControllerを用いて表示することは採用したアーキテクチャにもよると思いますが、よくあることかと思います。
ただし、プロジェクト作成時にLife CycleSwiftUI Appを選択した場合に少し実装が必要だったため記しておきます。

実装

SwiftUI Appでプロジェクトを作成すると、以下のようなファイルが生成されます。
このままだとContentViewが初期表示画面になってしまいます。
例えばCoordinatorRooterパターン等を利用したい場合はAppDelegateSceneDelegateを経由したくなります。

SampleApp.swift
import SwiftUI

@main
struct SampleApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

まず、AppDelegateSceneDelegateをそれぞれ自分で作成します。
自作したSceneDelegateが呼び出されるような実装をAppDelegateにしていきます。

SceneDelegate.swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = SampleViewController()
            window.makeKeyAndVisible()
            self.window = window
        }
    }

}
AppDelegate.swift
import UIKit

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        let config = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
        config.delegateClass = SceneDelegate.self
        return config
    }

}

これであとは、AppDelegateが呼び出されるようにするだけです。
@UIApplicationDelegateAdaptorを利用します。

SampleApp.swift
import SwiftUI

@main
struct SampleApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
        }
    }
}

これで、SceneDelegateで指定しているSampleViewControllerが表示されるようになります。

おわりに

そもそもSwiftUI Appを選択しなければ良い話ですが、参考になる方がいればいいなと思います。
単純に起動時に処理がしたいだけであればScenePhaseというものもあるようです。
https://developer.apple.com/documentation/swiftui/scenephase

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?