The Missing Manual
for Swift Development
The Guide I Wish I Had When I Started Out
Join 20,Swiftの開発について学ぶ000人以上の開発者たち
無料のコピーをダウンロードする
写真プロジェクトでは、ビューコントローラの設計と作成にもっぱらストーリーボードを使用しています。 このエピソードでは、コーディネータパターンはストーリーボードに限定されないことをお見せします。 ストーリーボードよりも XIB ファイルを好む場合にも、コーディネータ パターンを使用することができます。 もし、どちらも使いたくないのであれば、それも可能です。 プロジェクトのビューコントローラーをどのように設計して作成するかは問題ではありません。
Starter Project
このエピソードのスタータープロジェクトは、前回のエピソードの完成したプロジェクトと機能的に同じです。 しかし、いくつか指摘しておきたい違いがあります。 TermsViewController
クラスは Storyboardable
プロトコルに準拠しなくなり、TermsViewControllerStoryboard
、TermsViewControllerXIB
、TermsViewControllerCode
という 3 つのサブクラスがあります。
TermsViewControllerStoryboard
クラスは、前回のエピソードの TermsViewController
クラスと同じものです。 TermsViewControllerStoryboard
クラスのユーザーインターフェースはMain.storyboardで定義されています。 Storyboardable
プロトコルのinstantiate()
メソッドを呼び出すことで、このクラスのインスタンスを生成できます。
TermsViewControllerXIB
クラスのユーザーインターフェースはTermsViewControllerXIB.xibで定義されています。 TermsViewControllerXIB
クラスは、文字列リテラルの使用を避けるために、静的な変数プロパティ nibName
を定義しています。 これは、Storyboardable.swiftで定義されているstoryboardIdentifier
プロパティと同様です。
名前が示すように、TermsViewControllerCode
クラスはストーリーボードやXIBファイルへのリンクを持っていません。 ユーザーインターフェイスはコードで作成されます。 このため、明らかにかなり多くのコードになります。 これらのビュー コントローラーをそれぞれ見て、それらがどのようにコーディネーター パターンに適合するかを調べてみましょう。
Storyboards
ストーリーボードは数年前からあり、Apple は開発者がそれらを使用することを奨励しています。 私は、作業するほとんどのプロジェクトでストーリーボードを使用しています。 Xcode は、新しいプロジェクトを作成するときに自動的にストーリーボードを作成しますが、1 つの大きなストーリーボードの代わりに、いくつかの小さなストーリーボードを使用することを強くお勧めします。 複数の小さいストーリーボードを使用することにより、マージの衝突をより簡単に回避でき、小さいストーリーボードでの作業はより速く、より複雑ではありません。
Segue はストーリーボードの重要な機能ですが、私はコーディネーター パターンと組み合わせて使用したことはありません。 コーディネータ パターンと組み合わせてセグエを使用することは可能ですが、セグエはアプリケーション フローにビュー コントローラを巻き込み、それは避けたいことです。 プロジェクトのコーディネーターがアプリケーションフローを処理することを忘れないでください。 ビュー コントローラーは、アプリケーション フローについて何も知る必要はなく、他のビュー コントローラーについて知る必要もありません。 私はいつも中規模から大規模のプロジェクトをモジュールに分割しています。 各モジュールには、そのモジュールのビューコントローラを含むストーリーボードがあります。
TermsCoordinator.swift を開き、showTerms()
メソッドに移動してください。 この実装は、前回のエピソードの完成したプロジェクトと同じです。 唯一の違いは、ビューコントローラクラスの名前です。 用語コーディネータは、TermsViewController
クラスの代わりに TermsViewControllerStoryboard
クラスをインスタンス化します。
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerStoryboard.instantiate() // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
XIBs
XIB ファイルは Cocoa 開発の初期から存在しています。 ストーリーボードと比較すると、いくつかの機能が不足していますが、まだその価値はあります。 私は主に、テーブル ビュー セルやコレクション ビュー セルなど、再利用可能なコンポーネントのために XIB を使用しています。 TermsViewControllerXIB
クラスのユーザーインターフェースは、Main.storyboardのTermsViewControllerStoryboard
クラスのユーザーインターフェースと同じです。 TermsCoordinator.swiftを開き、showTerms()
メソッドを再確認してください。 TermsViewControllerXIB
クラスのインスタンスを作成するために、XIB ファイルの名前と XIB ファイルを含むバンドルへの参照を渡して init(nibName:bundle:)
イニシャライザを呼び出します。
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerXIB(nibName: TermsViewControllerXIB.nibName, bundle: .main) // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
Code
プロジェクトのビュー コントローラーのユーザー インターフェイスをコードで作成することも可能です。 ストーリーボードや XIB ファイルが嫌いな場合は、これが唯一の選択肢となります。 ストーリーボードが導入されて以来、私はこのオプションをあまり使用していませんが、時折役に立つことがあります。
コードでビュー コントローラーを作成および初期化することは、そのビュー コントローラーが複雑または動的なユーザー インターフェイスを持つ場合に便利です。 コード内でビュー コントローラーを作成および初期化することには、もう 1 つの魅力的な利点があります。 それは、依存性注入の一種である初期化子注入を可能にすることです。 依存性注入については、次のエピソードで説明します。
TermsViewControllerCode
クラスのインスタンスを作成するために、init()
イニシャライザを呼び出します。 これは、init(nibName:bundle:)
イニシャライザーを呼び出し、両方の引数に nil
を渡すことと同じです。
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerCode() // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
次は?
コーディネータパターンは柔軟なパターンです。 ストーリーボード、XIB ファイル、またはその両方を使用することは問題ではありません。 セグメンテーションを使用することもできますが、それを行うと、コーディネータ・パターンの基本原則に違反することになることを覚えておいてください。 ビューコントローラはアプリケーションフローについて知る必要はありませんし、他のビューコントローラについて知るべきでもありません。