デリゲート通信のためのCoordinatorパターン
makeCoordinator()を使い、UIKitのデリゲートコールバックをSwiftUIに中継します。
「デリゲート通信のためのCoordinatorパターン」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
Coordinatorを使う理由
UIKitのデリゲートにはオブジェクト参照が必要です。SwiftUIの値型はデリゲートになれないため、Coordinatorが橋渡しをします。
struct ImagePicker: UIViewControllerRepresentable {
@Binding var image: UIImage?
// Coordinator will be the UIImagePickerControllerDelegate
}makeCoordinator()
Coordinatorインスタンスを返すmakeCoordinator()を実装します。SwiftUIはmakeUIView/Controllerの前にこれを呼び出します。
func makeCoordinator() -> Coordinator {
Coordinator(self)
}Coordinatorクラス
Coordinatorは通常、デリゲートとの互換性のためにクラスとして定義し、親のrepresentableへの参照を保持します。
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: ImagePicker
init(_ parent: ImagePicker) { self.parent = parent }
}デリゲートの設定
makeUIViewController内で、context.coordinatorをデリゲートとして割り当てます。
func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
return picker
}デリゲートメソッドの実装
Coordinator内のデリゲートコールバックでは、親のバインディングを変更してSwiftUIへ値を書き戻します。
func imagePickerController(
_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
) {
parent.image = info[.originalImage] as? UIImage
picker.dismiss(animated: true)
}キャンセルコールバック
キャンセルのデリゲートメソッドを実装してピッカーを閉じ、必要に応じてSwiftUIへ通知します。
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true)
}Coordinatorによるデータソース
Coordinatorは、テーブルやコレクションビュー用にデータソースプロトコル(例:UITableViewDataSource)を実装することもできます。
class Coordinator: NSObject, UITableViewDataSource {
var parent: MyTableView
init(_ p: MyTableView) { parent = p }
func tableView(_ tv: UITableView, numberOfRowsInSection s: Int) -> Int { parent.items.count }
func tableView(_ tv: UITableView, cellForRowAt ip: IndexPath) -> UITableViewCell {
let cell = tv.dequeueReusableCell(withIdentifier: "cell", for: ip)
cell.textLabel?.text = parent.items[ip.row]
return cell
}
}Coordinatorの更新
SwiftUIが再レンダリングすると、updateUIViewControllerが呼び出されます。必要に応じて、Coordinatorの参照を新しい親に更新します。
func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
context.coordinator.parent = self
}複数のデリゲート
Coordinatorは複数のデリゲートプロトコルに準拠し、UIKitからのすべてのコールバックを一元管理できます。
class Coordinator: NSObject,
UIScrollViewDelegate,
UITextViewDelegate,
UISearchBarDelegate { ... }Coordinatorと@Binding
単純な値の受け渡しには@Bindingを使い、UIKitでデリゲート参照が必要な場合はCoordinatorを使います。
// Simple: @Binding var text: String -> updateUIView writes uiView.text = text
// Complex: coordinator mediates UITextViewDelegate -> parent.text = textView.textCoordinatorのライフサイクル
Coordinatorはrepresentableごとに一度作成され、そのrepresentableがビュー階層に存在する間保持されます。
// makeCoordinator called once → stable delegate reference
// updateUIView called many times → push state changes理解度チェック
デリゲートの橋渡しオブジェクトを作成するために、UIViewControllerRepresentableで実装する必要があるメソッドはどれですか?
レッスンのまとめ
Coordinatorパターンでは、makeCoordinator()を実装し、UIKitのデリゲートプロトコルに準拠するクラスを作成します。makeUIViewController内でcontext.coordinatorを使って割り当て、parentに保持したバインディングを介してSwiftUIへ値を書き戻します。
よくある質問
「デリゲート通信のためのCoordinatorパターン」レッスンは無料ですか?
はい。「デリゲート通信のためのCoordinatorパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「デリゲート通信のためのCoordinatorパターン」で何を学びますか?
makeCoordinator()を使い、UIKitのデリゲートコールバックをSwiftUIに中継します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「デリゲート通信のためのCoordinatorパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- UIViewRepresentable:UIKit Viewのラップ
- デリゲート通信のためのCoordinatorパターン
- UIViewControllerRepresentable
- UIHostingController:UIKit内のSwiftUI