UIViewControllerRepresentable
ضمّنوا وحدات تحكم عروض UIKit كاملة مثل UIImagePickerController في SwiftUI.
UIViewControllerRepresentable درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما هو UIViewControllerRepresentable؟
يشبه UIViewRepresentable، لكنه يغلّف UIViewController كاملًا لاستخدامه داخل SwiftUI.
struct ImagePickerView: UIViewControllerRepresentable {
@Binding var image: UIImage?
}makeUIViewController
أنشئ متحكم عرض UIKit واضبطه. ويُستدعى هذا الأسلوب مرة واحدة عندما يعرض SwiftUI الكائن القابل للتمثيل للمرة الأولى.
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()
}تمرير الإغلاقات لعمليات الاستدعاء
بدلًا من عمليات الربط، مرّر إغلاقات للاستدعاء إلى الكائن القابل للتمثيل للإبلاغ عن الأحداث.
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 الخاصة بالكائن القابل للتمثيل؟
مراجعة الدرس
يغلّف UIViewControllerRepresentable متحكمات عروض UIKit الكاملة. طبّق makeUIViewController (للإنشاء مرة واحدة)، وupdateUIViewController (لمزامنة الحالة)، واختياريًا dismantleUIViewController (للتنظيف). استخدم Coordinator لاستدعاءات المفوّض.
الأسئلة الشائعة
هل درس «UIViewControllerRepresentable» مجاني؟
نعم — نص درس «UIViewControllerRepresentable» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «UIViewControllerRepresentable»؟
ضمّنوا وحدات تحكم عروض UIKit كاملة مثل UIImagePickerController في SwiftUI. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «UIViewControllerRepresentable»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- UIViewRepresentable: تغليف عروض UIKit
- نمط Coordinator لتواصل المفوَّض
- UIViewControllerRepresentable
- UIHostingController: SwiftUI داخل UIKit