概要
比較して学ぶ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から追加された項目のようです。書籍には登場しません。 ↩