Swift Academy · Lektion

Coordinator-mönstret för delegate-kommunikation

Använd makeCoordinator() för att vidarebefordra UIKit-delegate-callbacks till SwiftUI.

Lektion 2 av 413 steg

Coordinator-mönstret för delegate-kommunikation är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.

Varför Coordinator?

UIKit-delegater kräver en objektreferens. SwiftUIs värdetyper kan inte vara delegater. Coordinator är bryggan.

struct ImagePicker: UIViewControllerRepresentable {
  @Binding var image: UIImage?
  // Coordinator will be the UIImagePickerControllerDelegate
}

makeCoordinator()

Implementera makeCoordinator() så att den returnerar en Coordinator-instans. SwiftUI anropar denna före makeUIView/Controller.

func makeCoordinator() -> Coordinator {
  Coordinator(self)
}

Klassen Coordinator

Coordinator är vanligtvis en klass (för att fungera med delegater) som innehåller en referens till sin överordnade representabel.

class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  var parent: ImagePicker
  init(_ parent: ImagePicker) { self.parent = parent }
}

Ange delegaten

I makeUIViewController tilldelar du context.coordinator som delegat.

func makeUIViewController(context: Context) -> UIImagePickerController {
  let picker = UIImagePickerController()
  picker.delegate = context.coordinator
  return picker
}

Implementera delegatmetoder

Delegatåteranrop i Coordinator skriver tillbaka till SwiftUI genom att ändra bindningar på den överordnade representabeln.

func imagePickerController(
  _ picker: UIImagePickerController,
  didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
) {
  parent.image = info[.originalImage] as? UIImage
  picker.dismiss(animated: true)
}

Avbrytningsåteranrop

Implementera avbrytningsdelegaten för att stänga väljaren och vid behov meddela SwiftUI.

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  picker.dismiss(animated: true)
}

Datakälla via Coordinator

Coordinator kan även implementera datakällprotokoll, till exempel UITableViewDataSource, för tabell- och samlingsvyer.

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
  }
}

Hålla Coordinator uppdaterad

När SwiftUI renderar om anropas updateUIViewController. Uppdatera vid behov koordinatorns referens till den nya överordnade representabeln.

func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
  context.coordinator.parent = self
}

Flera delegater

En Coordinator kan följa flera delegatprotokoll och samla alla UIKit-återanrop på ett ställe.

class Coordinator: NSObject,
  UIScrollViewDelegate,
  UITextViewDelegate,
  UISearchBarDelegate { ... }

Coordinator jämfört med @Binding

Använd @Binding för enkel vidarebefordran av värden och Coordinator när UIKit kräver en delegatreferens.

// Simple: @Binding var text: String -> updateUIView writes uiView.text = text
// Complex: coordinator mediates UITextViewDelegate -> parent.text = textView.text

Coordinators livscykel

Coordinator skapas en gång per representabel och lever så länge representabeln finns i vyträdet.

// makeCoordinator called once → stable delegate reference
// updateUIView called many times → push state changes

Snabbkontroll

Vilken metod måste implementeras i UIViewControllerRepresentable för att skapa objektet som fungerar som delegatbrygga?

Lektionssammanfattning

Coordinator-mönstret: implementera makeCoordinator(), skapa en klass som följer UIKit:s delegatprotokoll, tilldela den via context.coordinator i makeUIViewController och skriv tillbaka till SwiftUI genom bindningar som lagras i parent.

Gratis att börja

Lär dig Swift med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
122
Lektioner
409

Vanliga frågor

Är lektionen ”Coordinator-mönstret för delegate-kommunikation” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Coordinator-mönstret för delegate-kommunikation”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Coordinator-mönstret för delegate-kommunikation”?

Använd makeCoordinator() för att vidarebefordra UIKit-delegate-callbacks till SwiftUI. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Swift Academy?

Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Coordinator-mönstret för delegate-kommunikation”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Swift Academy-lektionen?

Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. UIViewRepresentable: omsluta UIKit-vyer
  2. Coordinator-mönstret för delegate-kommunikation
  3. UIViewControllerRepresentable
  4. UIHostingController: SwiftUI i UIKit
← Tillbaka till Swift Academy