0Pricing
Swift Academy · レッスン

デリゲート通信のための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.text

Coordinatorのライフサイクル

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. UIViewRepresentable:UIKit Viewのラップ
  2. デリゲート通信のためのCoordinatorパターン
  3. UIViewControllerRepresentable
  4. UIHostingController:UIKit内のSwiftUI
← Swift Academyに戻る