Coordinator-mönstret för delegate-kommunikation
Använd makeCoordinator() för att vidarebefordra UIKit-delegate-callbacks till SwiftUI.
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.textCoordinators 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 changesSnabbkontroll
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.
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
- UIViewRepresentable: omsluta UIKit-vyer
- Coordinator-mönstret för delegate-kommunikation
- UIViewControllerRepresentable
- UIHostingController: SwiftUI i UIKit