รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย
ใช้ makeCoordinator() เพื่อส่งต่อการเรียกกลับจากผู้รับมอบหมายของ UIKit ไปยัง SwiftUI
รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องใช้ Coordinators
ตัวแทนของ UIKit ต้องใช้ออบเจ็กต์แบบอ้างอิง แต่ประเภทค่าใน SwiftUI ไม่สามารถเป็นตัวแทนได้ Coordinator จึงทำหน้าที่เป็นสะพานเชื่อม
struct ImagePicker: UIViewControllerRepresentable {
@Binding var image: UIImage?
// Coordinator will be the UIImagePickerControllerDelegate
}makeCoordinator()
ใช้งาน makeCoordinator() โดยคืนอินสแตนซ์ของ Coordinator 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 โดยเปลี่ยนแปลงการเชื่อมโยงค่าบน parent
func imagePickerController(
_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
) {
parent.image = info[.originalImage] as? UIImage
picker.dismiss(animated: true)
}การเรียกกลับเมื่อยกเลิก
ใช้งานตัวแทนการยกเลิกเพื่อปิด picker และแจ้งให้ 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 ไปยัง parent ใหม่หากจำเป็น
func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
context.coordinator.parent = self
}ตัวแทนหลายรายการ
Coordinator สามารถสอดคล้องกับโปรโตคอลตัวแทนหลายรายการ เพื่อรวมการเรียกกลับทั้งหมดจาก UIKit ไว้ในที่เดียว
class Coordinator: NSObject,
UIScrollViewDelegate,
UITextViewDelegate,
UISearchBarDelegate { ... }Coordinator เทียบกับ @Binding
ใช้ @Binding สำหรับการส่งผ่านค่าอย่างง่าย และใช้ Coordinator เมื่อ UIKit ต้องการการอ้างอิงไปยังตัวแทน
// 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 กำหนดให้เป็นตัวแทนผ่าน context.coordinator ใน makeUIViewController และเขียนค่ากลับไปยัง SwiftUI ผ่านการเชื่อมโยงค่าที่จัดเก็บไว้ใน parent
เรียนรู้ Swift ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 122
- บทเรียน
- 409
คำถามที่พบบ่อย
บทเรียน “รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย”
ใช้ makeCoordinator() เพื่อส่งต่อการเรียกกลับจากผู้รับมอบหมายของ UIKit ไปยัง SwiftUI คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- UIViewRepresentable: ห่อหุ้ม View ของ UIKit
- รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย
- UIViewControllerRepresentable
- UIHostingController: SwiftUI ภายใน UIKit