Xcode 11でStoryboardを使わずに開発する
Xcode 11より、新たにSceneという概念が導入されました。本記事では、SceneDelegateにおける、Storyboardを使わないwindowの生成方法と、iOS 12以下の対処方法を解説します。
Sceneとは
iOS 13/Xcode 11よりSceneが導入されました。Sceneによって、Multiple windowsでの動作が可能になります。Multiple windowsとは、iPadOSで同時にいくつかのセッションを開ける機能を指しています。
Xcode 11より、新規プロジェクトを作成するとSceneDelegate.swiftが自動生成されるようになります。このファイルでは、いくつかあるSceneの内の1つのライフサイクルを管理します。一方で、AppDelegateの中にもSceneに関するメソッドが追加されています。こちらは、Sceneの追加や削除といった、アプリケーション全体に関わるメソッドです。
まとめると、AppDelegateはアプリケーションレベルのライフサイクルを管理し、SceneDelegateはSceneレベルのライフサイクルを管理します。
SceneDelegate without Storyboard
Main.storyboardを消して、1 view controller — 1 xibで開発するスタイルが多いと思いますが、SceneDelegateの導入によって、ほとんど同じではありますが、これまでと生成方法が少し変わります。
- Targetsの
Main Interface
を空にする - Info.plistから
Application Scene Manifest
の値を変更するApplication Scene Manifest
>Scene Configuration
>Application Session Role
>Item 0 (Default Configuration)
からStoryboard Name
を削除します。 - windowの
rootViewController
を指定する
SceneDelegateのscene(_:willConnectTo:options:)
メソッドの中で、以下のように指定します。
以上で、Storyboardを使わずにwindowを生成できます。
iOS 12以下への対応
iOS 12以下を対象にすると、そのままではビルドが通りません。まず、available
をつけてSceneDelegate関連のコードを切り分けましょう。
AppDelegateでwindowを宣言し、iOS 13未満の場合は従来通りapplication(_: didFinishLaunchingWithOptions:)
内でwindowの設定を行います。
以上でiOS 12以下も問題なく動くようになります。