Swift Academy · บทเรียน

รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย

ใช้ makeCoordinator() เพื่อส่งต่อการเรียกกลับจากผู้รับมอบหมายของ UIKit ไปยัง SwiftUI

บทเรียน 2 จาก 413 ขั้นตอน

รูปแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. UIViewRepresentable: ห่อหุ้ม View ของ UIKit
  2. รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย
  3. UIViewControllerRepresentable
  4. UIHostingController: SwiftUI ภายใน UIKit
← กลับไปที่ Swift Academy