0Pricing
Swift Academy · บทเรียน

UIViewControllerRepresentable

ฝังตัวควบคุม View ของ UIKit แบบเต็ม เช่น UIImagePickerController ใน SwiftUI

UIViewControllerRepresentable เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

UIViewControllerRepresentable คืออะไร

คล้ายกับ UIViewRepresentable แต่ใช้ห่อหุ้ม UIViewController ทั้งตัวเพื่อใช้งานภายใน SwiftUI

struct ImagePickerView: UIViewControllerRepresentable {
  @Binding var image: UIImage?
}

makeUIViewController

สร้างและกำหนดค่าวิวคอนโทรลเลอร์ของ UIKit เมธอดนี้ถูกเรียกครั้งเดียวเมื่อ SwiftUI วาด representable เป็นครั้งแรก

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

updateUIViewController

ถูกเรียกทุกครั้งที่สถานะของ SwiftUI เปลี่ยนแปลง ให้ส่งค่าที่อัปเดตแล้วไปยังวิวคอนโทรลเลอร์เดิม

func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
  // Update vc if needed (e.g., change source type)
}

dismantleUIViewController

เมธอดทำความสะอาดแบบสแตติกที่ถูกเรียกก่อนนำวิวคอนโทรลเลอร์ออกจากลำดับชั้น

static func dismantleUIViewController(_ vc: UIImagePickerController, coordinator: Coordinator) {
  vc.dismiss(animated: false)
}

การห่อหุ้ม UIDocumentPickerViewController

ตัวอย่าง: ห่อหุ้มตัวเลือกเอกสารเพื่อให้ผู้ใช้เลือกไฟล์และส่ง URL กลับไปยัง SwiftUI

struct DocumentPicker: UIViewControllerRepresentable {
  @Binding var url: URL?
  func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
    let picker = UIDocumentPickerViewController(forOpeningContentTypes: [.pdf])
    picker.delegate = context.coordinator
    return picker
  }
  func updateUIViewController(_ vc: UIDocumentPickerViewController, context: Context) {}
}

การนำเสนอแบบโมดัล

ฝัง UIViewControllerRepresentable ไว้ใน .sheet เพื่อแสดงแบบโมดัล

@State private var showPicker = false
var body: some View {
  Button("Pick Image") { showPicker = true }
    .sheet(isPresented: $showPicker) {
      ImagePickerView(image: $selectedImage)
    }
}

ตัวอย่างตัวเขียนอีเมล

ห่อหุ้ม MFMailComposeViewController เพื่อแสดงชีตเขียนอีเมลจาก SwiftUI

struct MailView: UIViewControllerRepresentable {
  @Binding var isShowing: Bool
  func makeUIViewController(context: Context) -> MFMailComposeViewController {
    let vc = MFMailComposeViewController()
    vc.mailComposeDelegate = context.coordinator
    vc.setSubject("Hello from SwiftUI")
    return vc
  }
  func updateUIViewController(_ vc: MFMailComposeViewController, context: Context) {}
}

การแสดงเต็มหน้าจอ

ใช้ .fullScreenCover กับวิวคอนโทรลเลอร์ที่ต้องขยายเต็มหน้าจอ

.fullScreenCover(isPresented: $showCamera) {
  CameraViewController()
}

การส่งฟังก์ชันสำหรับการเรียกกลับ

แทนที่จะใช้การเชื่อมโยงค่า ให้ส่งฟังก์ชันเรียกกลับไปยัง representable เพื่อแจ้งเหตุการณ์

struct VideoPlayer: UIViewControllerRepresentable {
  let url: URL
  var onFinish: () -> Void
  // Coordinator calls onFinish when playback ends
}

ขนาดโดยธรรมชาติ

วิวคอนโทรลเลอร์ของ UIKit จะกำหนดขนาดของตัวเอง ใช้ตัวปรับแต่งเฟรมของ SwiftUI หรือขนาดเนื้อหาที่ต้องการของวิวคอนโทรลเลอร์

struct Popover: UIViewControllerRepresentable {
  func makeUIViewController(context: Context) -> UIViewController {
    let vc = UIViewController()
    vc.preferredContentSize = CGSize(width: 300, height: 200)
    return vc
  }
  func updateUIViewController(_ vc: UIViewController, context: Context) {}
}

กรณีการใช้งานทั่วไป

มักใช้ UIViewControllerRepresentable กับสิ่งต่อไปนี้: UIImagePickerController, MFMailComposeViewController, AVPlayerViewController, UIDocumentPickerViewController และ SFSafariViewController

import SafariServices
struct SafariView: UIViewControllerRepresentable {
  let url: URL
  func makeUIViewController(context: Context) -> SFSafariViewController {
    SFSafariViewController(url: url)
  }
  func updateUIViewController(_ vc: SFSafariViewController, context: Context) {}
}

ตรวจสอบความเข้าใจ

SwiftUI เรียกใช้เมธอดใดทุกครั้งที่อินพุตของ SwiftUI ใน representable เปลี่ยนแปลง

สรุปบทเรียน

UIViewControllerRepresentable ใช้ห่อหุ้มวิวคอนโทรลเลอร์ของ UIKit ทั้งตัว ให้ใช้งาน makeUIViewController (สร้างครั้งเดียว), updateUIViewController (ซิงค์สถานะ) และอาจใช้งาน dismantleUIViewController (ทำความสะอาด) เพิ่มเติม ใช้ Coordinator สำหรับการเรียกกลับจากตัวแทน

คำถามที่พบบ่อย

บทเรียน “UIViewControllerRepresentable” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “UIViewControllerRepresentable” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “UIViewControllerRepresentable”

ฝังตัวควบคุม View ของ UIKit แบบเต็ม เช่น UIImagePickerController ใน SwiftUI คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “UIViewControllerRepresentable” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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