0Pricing
Swift Academy · درس

نمط Coordinator لتواصل المفوَّض

استخدموا makeCoordinator() لترحيل استدعاءات مفوَّض UIKit إلى SwiftUI.

نمط Coordinator لتواصل المفوَّض درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

لماذا نستخدم المنسّقات؟

تتطلب مفوّضات UIKit مرجعًا إلى كائن. ولا يمكن لأنواع Swift ذات القيمة أن تكون مفوّضات. والمنسّق هو الجسر بينهما.

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 عادةً فئة، لتوافقها مع المفوّضات، وتحمل مرجعًا إلى الكائن القابل للتمثيل الأب.

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 عبر تعديل عمليات الربط في الكائن الأب.

func imagePickerController(
  _ picker: UIImagePickerController,
  didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
) {
  parent.image = info[.originalImage] as? UIImage
  picker.dismiss(animated: true)
}

استدعاء الإلغاء

طبّق مفوّض الإلغاء لإغلاق أداة الاختيار، وإبلاغ SwiftUI اختياريًا.

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  picker.dismiss(animated: true)
}

مصدر البيانات عبر 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. حدّث مرجع المنسّق إلى الكائن الأب الجديد عند الحاجة.

func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
  context.coordinator.parent = self
}

مفوّضون متعددون

يمكن للمنسّق التوافق مع بروتوكولات مفوّض متعددة، ما يتيح جمع جميع استدعاءات 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 مرة واحدة لكل كائن قابل للتمثيل، ويظل موجودًا طوال بقاء الكائن القابل للتمثيل في شجرة العروض.

// makeCoordinator called once → stable delegate reference
// updateUIView called many times → push state changes

فحص سريع

أي أسلوب يجب تطبيقه في UIViewControllerRepresentable لإنشاء كائن جسر المفوّض؟

مراجعة الدرس

نمط Coordinator: طبّق makeCoordinator()، وأنشئ فئة تطابق بروتوكولات مفوّضي UIKit، وعيّنها عبر context.coordinator في makeUIViewController، ثم أعد الكتابة إلى SwiftUI من خلال عمليات الربط المخزّنة في parent.

الأسئلة الشائعة

هل درس «نمط Coordinator لتواصل المفوَّض» مجاني؟

نعم — نص درس «نمط Coordinator لتواصل المفوَّض» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «نمط Coordinator لتواصل المفوَّض»؟

استخدموا makeCoordinator() لترحيل استدعاءات مفوَّض UIKit إلى SwiftUI. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «نمط Coordinator لتواصل المفوَّض»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏UIViewRepresentable: تغليف عروض UIKit
  2. نمط Coordinator لتواصل المفوَّض
  3. ‏UIViewControllerRepresentable
  4. ‏UIHostingController: SwiftUI داخل UIKit
← العودة إلى Swift Academy