なんでXib(Xcode Interface Builder)を使うの??
Xibとはアプリケーションの画面をレイアウトする時に使うやつです。
基本的な扱いはStoryBoardと似ています。
【Xibのメリット】
作った画面を複数の画面で再利用するのが簡単
画面の1部のパーツを作ることができる
【Xibのデメリット】
ファイル数が増えがち。。。
画面遷移の関係が可視化されない(コードで書くから)
今回やってみること
アプリ起動時の初期画面をXibで作った画面に設定する(iOS13で実現)
iOS13からは、SceneDelegateがテンプレートとして標準化されているのでiOS12以前のやり方と少しだけ違うみたいです。
実装の方法
では、早速作っていきます
ViewControllerとXibファイルを作成する
とりあえず、プロジェクトを作ります。そしたら、画像のようにプロジェクトのフォルダを選択してください。
この状態で、新規ファイルを作成します。
今回は、[CocoaTouchClass]を選択して次へ!
名前はなんでもいいんですけど、わかりやすいように[XibViewController]にしました。
それで、[UIViewControllerクラス]を継承します。
【重要】 最後に、[Also create XIB file]にチェックをつけてください
ファイルの作成が完了したら、こんな感じになると思います。
普通にファイルを作る時と異なるポイントは、.swiftと.xibの2つのファイルができることです。
この時に作成された、XibファイルをStoryBoardのように使っていきます。
Xibファイルを編集する
起動した時に、ちゃんとXibから起動しているか分かりやすいよう、こんな感じで編集しておきましょう。
Viewの作り方はStoryBoardと同じです。
SceneDelegate.swiftを編集する
最後に、iOS13から標準装備されている、SceneDelegate.swift
にコードをちょこっとだけ書きます。
変更したところだけを抜き出すとこんな感じ。。。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
の中で、アプリ起動時に表示される画面を今回作ったXibファイルに対応するViewControllerに設定しています。
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
// MARK: -変更点
// ここから
let window = UIWindow(windowScene: scene as! UIWindowScene)
self.window = window
window.makeKeyAndVisible()
// ここのViewControllerの名前は、さっき作ったクラスファイル名
let xibVC = XibViewController()
window.rootViewController = xibVC
// ここまで
}
起動してみる
こんな感じ
Main.storyboardではなく、Xibから起動されていることが確認できました。
おわりに
今回は、Xibを最初の画面として起動する方法について書いてみました。
この方法を勉強しなきゃいけなかった時に、iOS13より前ののやり方で、実装したら上手くいかず、苦戦してしまったので、記事にしました。