LoginSignup
0
2

More than 3 years have passed since last update.

Xcode11でストーリーボードなしで画面ロードする方法

Last updated at Posted at 2020-07-28

概要

比較して学ぶRxSwift入門という本1がKindle Unlimtedで読めるので読み進めているところです。
とてもわかりやすく良い書籍なのですが、最新のXcode11ではつまづく点があるのでその解決方法を書きます。

この書籍のサンプルコードを実行するためには「開発を加速させる設定」なる設定が必要で、それはストーリーボードをプロジェクトから削除した上でxibファイルで作成した画面をアプリ起動時にロードする設定を指すのですが、書籍に書いてある通りに設定してもXcode11ではうまく動きません。2

この原因はどうやらXcode11から導入されたSceneDelegateが関係しているようで、これに関連するファイル・コード・設定を削除することで解決できます。

この、SceneDelegateに関連するファイル・コード・設定を削除する手順を含めた「開発を加速する設定」を以下に示します。

Xcode Version 11.5 (11E608c) で確認しています。

手順

おおまかな手順は以下の通りです。
1. Single View App のプロジェクトを作成する
2. Main.storyboadSceneDelegate.swift を削除する
3. Info.plist を編集する
4. AppDelegate.swift を編集する
5. ViewController.xib を作成する

手順ごとに具体的に見ていきます。

1.Single View Application のプロジェクトを作成する

  1. XCodeを起動し、File>New>Projectをクリックすると出てくるダイアログで Single View App を選択し、Next をクリックします。
  2. 次のダイアログでプロジェクト名などを設定します。この時、 LanguageSwiftUser InterfaceStoryboardを選択しておきます。設定したら Nextをクリックします。
  3. ファイルの保存先を指定して Create をクリックします。3

2.Main.storyboad、SceneDelegate.swiftを削除する

普通の手順です。画面左端のProject NavigaterからMain.storyboad と、SceneDelegate.swift を削除します。(Move To Trashを選択します) 4
スクリーンショット 2020-07-28 14.14.49.png

3. Info.plistを編集する

画面左端のProject NavigaterからInfo.plistを選択し、設定リストを表示します。
次に以下のエントリを選択し、マイナス記号をクリックして削除します。
- Application Scene Manifest 5
- Main storyboard file base name
スクリーンショット 2020-07-28 14.19.11.png

4. AppDelegate.swiftを編集する

画面左端のProject NavigaterからAppDelegate.swiftを開き、コードを全て削除した後、以下の内容をコピー&ペーストします。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let navigationController = UINavigationController(rootViewController: ViewController())
        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
        return true
    }
}

ちなみに、Xcode11では初期状態ではコードは以下のようになっていますが、ストーリーボードを使用しない場合、赤枠の部分のSceneDelegate関連のメソッドは不要となるため削除します。
スクリーンショット 2020-07-28 14.35.06.png

5. ViwController.xibを作成する

この手順は書籍と同じです。
画面左端のProject Navigaterを右クリックし、NewFile>ViewでViewを選択し、Nextをクリック、次の画面で ファイル名(Save As:)を ViewController.xibとして Createをクリックします。
次にビューエディタの左側のPlaceholders>File's Ownerを選択し、ClassをViewControllerに変更します。
スクリーンショット 2020-07-28 14.49.47.png
次にOutletsのviewとViewControllerのViewを接続します。
スクリーンショット 2020-07-28 14.54.44.png

確認

Build&Runしてシミュレータに以下の画面が出ればOKです。
スクリーンショット 2020-07-28 15.08.56.png

念のためViewController.swiftViewDidLoad()にブレークポイントを設定して狙い通りの画面がロードされていることを確認するのも良い考えだと思います。
スクリーンショット 2020-07-28 15.04.01.png

画面がうまく出てこない場合

上記手順で ViewController.swiftの中で定義されたクラス名やViewController.xibのファイル名を任意のものに変更した場合、以下のような画面が出てうまくいかないかもしれません。
スクリーンショット 2020-07-28 15.15.01.png
*.xibのファイル名とそれに紐づくViewControlerのクラス名が一致しない場合に上記の現象が起こります。これらは一致させる必要があるようです。

以上


  1. https://www.amazon.co.jp/dp/4844398792/ この文中で「書籍」と呼ぶ場合はこれを指します。 

  2. シミュレータでのアプリ起動時に実行時エラーが発生する Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle <略> (loaded)' 

  3. 普通の手順ですが、書籍と違い、Xcode11ではUser Interface で SwiftUIが選択できてしまうので注意します。 

  4. SceneDelegate.swift も削除するところが書籍と異なります。 

  5. Xcode11から追加された項目のようです。書籍には登場しません。 

0
2
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
0
2