Wzorzec Coordinator do komunikacji z delegatem
Używanie makeCoordinator() do przekazywania wywołań zwrotnych delegata UIKit do SwiftUI.
Wzorzec Coordinator do komunikacji z delegatem to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Dlaczego koordynatory
Delegaty UIKit wymagają referencji do obiektu. Typy wartości SwiftUI nie mogą pełnić roli delegatów. Koordynator jest pomostem między nimi.
struct ImagePicker: UIViewControllerRepresentable {
@Binding var image: UIImage?
// Coordinator will be the UIImagePickerControllerDelegate
}makeCoordinator()
Zaimplementuj makeCoordinator(), zwracając instancję Coordinator. SwiftUI wywołuje tę metodę przed makeUIView/Controller.
func makeCoordinator() -> Coordinator {
Coordinator(self)
}Klasa Coordinator
Coordinator jest zazwyczaj klasą (ze względu na zgodność z delegatami), która przechowuje referencję do nadrzędnego obiektu representable.
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: ImagePicker
init(_ parent: ImagePicker) { self.parent = parent }
}Ustawianie delegata
W makeUIViewController przypisz context.coordinator jako delegata.
func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
return picker
}Implementowanie metod delegata
Wywołania zwrotne delegata w Coordinatorze przekazują dane z powrotem do SwiftUI, modyfikując powiązania w obiekcie nadrzędnym.
func imagePickerController(
_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
) {
parent.image = info[.originalImage] as? UIImage
picker.dismiss(animated: true)
}Wywołanie zwrotne anulowania
Zaimplementuj delegata anulowania, aby zamknąć picker i opcjonalnie powiadomić SwiftUI.
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true)
}Źródło danych za pośrednictwem Coordinator
Koordynatory mogą również implementować protokoły źródeł danych (np. UITableViewDataSource) dla widoków tabel i kolekcji.
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
}
}Aktualizowanie Coordinator
Podczas ponownego renderowania przez SwiftUI wywoływana jest metoda updateUIViewController. W razie potrzeby zaktualizuj referencję koordynatora do nowego obiektu nadrzędnego.
func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
context.coordinator.parent = self
}Wiele delegatów
Koordynator może być zgodny z wieloma protokołami delegatów, centralizując wszystkie wywołania zwrotne UIKit.
class Coordinator: NSObject,
UIScrollViewDelegate,
UITextViewDelegate,
UISearchBarDelegate { ... }Coordinator a @Binding
Użyj @Binding do prostego przekazywania wartości, a Coordinator zastosuj wtedy, gdy UIKit wymaga referencji do delegata.
// Simple: @Binding var text: String -> updateUIView writes uiView.text = text
// Complex: coordinator mediates UITextViewDelegate -> parent.text = textView.textCykl życia Coordinator
Coordinator jest tworzony raz dla każdego obiektu representable i istnieje tak długo, jak długo obiekt representable znajduje się w drzewie widoków.
// makeCoordinator called once → stable delegate reference
// updateUIView called many times → push state changesSzybkie sprawdzenie
Jaką metodę należy zaimplementować w UIViewControllerRepresentable, aby utworzyć obiekt będący pomostem dla delegata?
Podsumowanie lekcji
Wzorzec Coordinator: zaimplementuj makeCoordinator(), utwórz klasę zgodną z protokołami delegatów UIKit, przypisz ją za pomocą context.coordinator w makeUIViewController i przekazuj dane z powrotem do SwiftUI przez powiązania przechowywane w parent.
Często zadawane pytania
Czy lekcja „Wzorzec Coordinator do komunikacji z delegatem” jest bezpłatna?
Tak — pełny tekst „Wzorzec Coordinator do komunikacji z delegatem” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec Coordinator do komunikacji z delegatem”?
Używanie makeCoordinator() do przekazywania wywołań zwrotnych delegata UIKit do SwiftUI. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wzorzec Coordinator do komunikacji z delegatem”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- UIViewRepresentable: opakowywanie widoków UIKit
- Wzorzec Coordinator do komunikacji z delegatem
- UIViewControllerRepresentable
- UIHostingController: SwiftUI wewnątrz UIKit