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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- UIViewRepresentable: ห่อหุ้ม View ของ UIKit
- รูปแบบ Coordinator สำหรับการสื่อสารกับผู้รับมอบหมาย
- UIViewControllerRepresentable
- UIHostingController: SwiftUI ภายใน UIKit