概要
比較して学ぶRxSwift入門という本1がKindle Unlimtedで読めるので読み進めているところです。
とてもわかりやすく良い書籍なのですが、最新のXcode11ではつまづく点があるのでその解決方法を書きます。
この書籍のサンプルコードを実行するためには「開発を加速させる設定」なる設定が必要で、それはストーリーボードをプロジェクトから削除した上でxibファイルで作成した画面をアプリ起動時にロードする設定を指すのですが、書籍に書いてある通りに設定してもXcode11ではうまく動きません。2
この原因はどうやらXcode11から導入されたSceneDelegateが関係しているようで、これに関連するファイル・コード・設定を削除することで解決できます。
この、SceneDelegateに関連するファイル・コード・設定を削除する手順を含めた「開発を加速する設定」を以下に示します。
Xcode Version 11.5 (11E608c) で確認しています。
手順
おおまかな手順は以下の通りです。
- Single View App のプロジェクトを作成する
-
Main.storyboad
、SceneDelegate.swift
を削除する -
Info.plist
を編集する -
AppDelegate.swift
を編集する -
ViewController.xib
を作成する
手順ごとに具体的に見ていきます。
1.Single View Application のプロジェクトを作成する
- XCodeを起動し、File>New>Projectをクリックすると出てくるダイアログで
Single View App
を選択し、Next
をクリックします。 - 次のダイアログでプロジェクト名などを設定します。この時、
Language
はSwift
、User Interface
はStoryboard
を選択しておきます。設定したらNext
をクリックします。 - ファイルの保存先を指定して
Create
をクリックします。3
2.Main.storyboad、SceneDelegate.swiftを削除する
普通の手順です。画面左端のProject NavigaterからMain.storyboad
と、SceneDelegate.swift
を削除します。(Move To Trashを選択します) 4

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

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関連のメソッドは不要となるため削除します。
5. ViwController.xibを作成する
この手順は書籍と同じです。
画面左端のProject Navigaterを右クリックし、NewFile>ViewでViewを選択し、Nextをクリック、次の画面で ファイル名(Save As:)を ViewController.xib
として Createをクリックします。
次にビューエディタの左側のPlaceholders>File's Owner
を選択し、ClassをViewController
に変更します。
次にOutletsのviewとViewControllerのViewを接続します。
確認
Build&Runしてシミュレータに以下の画面が出ればOKです。
念のためViewController.swift
のViewDidLoad()
にブレークポイントを設定して狙い通りの画面がロードされていることを確認するのも良い考えだと思います。
画面がうまく出てこない場合
上記手順で ViewController.swift
の中で定義されたクラス名やViewController.xib
のファイル名を任意のものに変更した場合、以下のような画面が出てうまくいかないかもしれません。
*.xibのファイル名とそれに紐づくViewControlerのクラス名が一致しない場合に上記の現象が起こります。これらは一致させる必要があるようです。
以上
-
https://www.amazon.co.jp/dp/4844398792/ この文中で「書籍」と呼ぶ場合はこれを指します。 ↩
-
シミュレータでのアプリ起動時に実行時エラーが発生する
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle <略> (loaded)'
↩ -
普通の手順ですが、書籍と違い、Xcode11では
User Interface
で SwiftUIが選択できてしまうので注意します。 ↩ -
SceneDelegate.swift
も削除するところが書籍と異なります。 ↩ -
Xcode11から追加された項目のようです。書籍には登場しません。 ↩