👻

iOSでプロジェクトからMain.storyboardを削除してRootのViewControllerをコードで生成する

2021/05/03に公開

iOSでプロジェクトからMain.storyboardを削除してRootのViewControllerをコードで生成する方法のメモ。

手順

  • プロジェクトからMain.storyboardを削除

  • Info.plistからstoryboardに関する記述を削除

diff --git a/uikit-architecture/Info.plist b/uikit-architecture/Info.plist
index 5b531f7..2688b32 100644
--- a/uikit-architecture/Info.plist
+++ b/uikit-architecture/Info.plist
@@ -33,8 +33,6 @@
                                        <string>Default Configuration</string>
                                        <key>UISceneDelegateClassName</key>
                                        <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
-                                       <key>UISceneStoryboardFile</key>
-                                       <string>Main</string>
                                </dict>
                        </array>
                </dict>
@@ -43,8 +41,6 @@
        <true/>
        <key>UILaunchStoryboardName</key>
        <string>LaunchScreen</string>
-       <key>UIMainStoryboardFile</key>
-       <string>Main</string>
        <key>UIRequiredDeviceCapabilities</key>
        <array>
                <string>armv7</string>
  • SceneDelegate.swiftにViewControllerを生成するコードを追加
diff --git a/uikit-architecture/SceneDelegate.swift b/uikit-architecture/SceneDelegate.swift
index 73be64c..275dc67 100644
--- a/uikit-architecture/SceneDelegate.swift
+++ b/uikit-architecture/SceneDelegate.swift
@@ -16,7 +16,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
         // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
         // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
-        guard let _ = (scene as? UIWindowScene) else { return }
+        guard let windowScene = (scene as? UIWindowScene) else { return }
+        window = UIWindow(frame: UIScreen.main.bounds)
+        window?.rootViewController = ViewController()
+        window?.makeKeyAndVisible()
+        window?.windowScene = windowScene

上記のプロジェクトはこちらにプッシュしてあります。
https://github.com/yorifuji/uikit-architecture

MVCやMVPなどの設計を勉強するときにこの手のプロジェクトが欲しくなります。

Discussion