ما فائدة ال delegate ومتى يتم استخدامه في swift ؟
السلام عليكم ورحمة الله وبركاته
ىأيت في الدروس شرح لكيفية التعامل مع tableview في بيئة xcode ومن خلال الشرح وضع في تحميل ال view التالي
tableview1.datasource = self
tableview1.delegate = self
بينما في شرح ءاخر وفي موقع ءاخر لم يتطرق لل delegate لا من قريب ولا من بعيد !!!
فالسؤال هل أجد أحد يشرح لي delegate ومتى يتم استخدامها ؟
الإجابة الصحيحة
لو افترضنا اني اشتغل على تطبيق يعرض لي المطاعم القريبة من مكاني ، في البداية احتاج اعرف
- العناصر اللي احتاجها في التطبيق
- التصميم المناسب اللي يخدم التطبيق
العناصر : بما ان التطبيق يعرض المطاعم القريبة فـ احتاج خريطة ( Map ) وكذلك احتاج قائمة ( tableView ) لعرض قائمة للمطاعم القريبة مع تفاصيل بسيطة مثل المسافة و التقييم وغيرها.
الشكل التقريبي يكون مثل التالي : خارطة في الجزء العلوي من الشاشة ، والقائمة في الاسفل
قبل اتكلم عن التصميم ، هذا الشكل الهيكلي التقريبي للصفحة
الجزء المسؤول عن عرض الـ view هو viewContoller ، وداخل الـ view اضفنا الخريطة ( Map ) و القائمة ( tableView ).
التصميم الهيكلي للـ classes : الخريطة ( Map ) و القائمة ( tableView ) كل واحد يمثل class/object مستقل بدواله وسلوكياته لكن احنا في حاجة ان نستخدم بعض سلوكيات الـخارطة وبعض سلوكيات القائمة داخل viewController ، آيش الحل ؟
نستخدم التصميم الوراثي ؟ غير منطقي لان viewController يجمع نوعين مختلفين وهو بنفسه مستقل عنهم فكيف نحوله الى subclass !!
الطريقة الصحيحة هي استخدام الـ protocol + delegation و يصير بإمكاننا نكييف الـ viewController مع الـ UITableViewDelegate و UITableViewDataSource و MKMapViewDelegate. بهذي الحالة ، احنا خصصنا الـ viewController بأنه يكون المسؤول عن الآتصال ب MKMapView و tableView عند الحاجة.
الـ delegation وسيلة اتصال class/object ب آخر. وسيلة الاتصال تصير اثناء استخدام التطبيق : اما عن طريق الضغط على الشاشة او تحريك الصفحة لفوق او تحت ( scroll down or up ) او غيرها.
الصورة توضح كيفية الـ delegation او التواصل بين الـ classes
وفي مثالنا ، هذي الصورة توضح الـ delegation
الـ delegate و dataSource بالضبط نفس الشي ، لكن delegate مسؤول عن التحكم بالواجهة و dataSource مسؤول عن البيانات واستدعائها.
************************************************************************************************************************************************
إيش التصميم او الطريقة المناسبة لو كان تطبيقي فقط لعرض قائمة اسماء ، التطبيق يحتوي على عنصر واحد اللي هو قائمة ( tableView ) فقط ؟
في هذي الحالة نستخدم التصميم الوراثي ، ننشئ ملف ويكون من نوع او subclass لـ UITableViewController. بهذي الطريقة ما نحتاج الـ delegate و الـ dataSource ، بمعنى اصح ما نحتاج الـ protocol والـ delegation لان كل السلوكيات تورث او نقدر نوصلها عن طريق التوريث .. لكن دائم حاول تستخدم viewController و الـ delegation لان لو احتجت ان تعدل او تضيف عناصر مثل UIButton , UISegmentedController في المستقبل ما راح تقدر تعدل او تضيف على UITableViewController فتضطر لحذف كل شي ..!!
اتمنى يكون الشرح سهل وواضح 🙂
الإجابات (2)
سؤالك جداًً اعجبني وكثير من المبرمجين يخطئ في فهم الـ delegate
خلني ابدأ بالإجابة عن اول جزء ، ليش في دروس للـ tableView ذكروا الـ delegate وفي دروس اخرى لم يتم ذكرها ؟
لأنشاء tableView هناك طريقتين (تصميمين) إما بإستخدام :
- OOP : يتم استخدام الـ UITableViewController كـ super class ، فبالمقابل انت تضطر لإستخدام الدوال والآوامر المعرفه ب الـ super class وهذي الطريقة تعرف ب polymorphism. هذا التصميم الوراثي ، كائن يورث كائن وهذي طريقة الاتصال او الوصول للدوال والأوامر اللي حاب تستخدمها.
- POP : يتم استخدام الـ UITableViewDelegate & UITableViewDataSourse المعرفة بـ Protocols ، ف اذا حاب ان class او struct ياخذ الدوال والاوامر ( السلوكيات ) المعرفة داخل اي protocol لازم تكييفه او توافقه مع الـ protocol اللي حاب تستخدمه بـ اضافته بعد اسم الـ class ، بهذي الحالة نقول ان " class conforms to the protocol ". طيب طريقة التواصل ؟ استخدام الـ delegate.
الجزء الثاني من السؤال ، آيش الـ delegate ؟
في ثلاث انواع من طرق تصميم البرامج ، بشكل عام اذا نتكلم عن البرمجة:
- Creational design
- Architectural design
- Communicational design
الـ delegation من ضمن التصاميم اللي تدخل تحت communicational design داخل البرنامج او التطبيق ، يتم استخدام هذا التصميم اذا طريقة الإتصال تكون بين نقطتين فقط (one-to-one). يختلف عن Notification Center او KVO ايضاًً هي احدى التصاميم اللي تدخل تحت communicational design لكن طريقة التواصل بين نقطة الى اكثر ( one-to-many ).
الموضوع طويل جداًً يحتاج تفصيل ، لكن هذه النظرة العامة والمختصرة عن الـ delegate
عبد الله: تبي الصراحة ؟ جوابك صعب الفهم احس انك تكلم واحد له خبره كبيرة ببرمجة ios ، ادري اني صدمتك بالرد لكن هذا الصحيح وانا حابب افهم شنو اعمل. اذا أمكن تفصل اكثر ولك جزيل الشكر مقدماً (:
لو افترضنا اني اشتغل على تطبيق يعرض لي المطاعم القريبة من مكاني ، في البداية احتاج اعرف
- العناصر اللي احتاجها في التطبيق
- التصميم المناسب اللي يخدم التطبيق
العناصر : بما ان التطبيق يعرض المطاعم القريبة فـ احتاج خريطة ( Map ) وكذلك احتاج قائمة ( tableView ) لعرض قائمة للمطاعم القريبة مع تفاصيل بسيطة مثل المسافة و التقييم وغيرها.
الشكل التقريبي يكون مثل التالي : خارطة في الجزء العلوي من الشاشة ، والقائمة في الاسفل
قبل اتكلم عن التصميم ، هذا الشكل الهيكلي التقريبي للصفحة
الجزء المسؤول عن عرض الـ view هو viewContoller ، وداخل الـ view اضفنا الخريطة ( Map ) و القائمة ( tableView ).
التصميم الهيكلي للـ classes : الخريطة ( Map ) و القائمة ( tableView ) كل واحد يمثل class/object مستقل بدواله وسلوكياته لكن احنا في حاجة ان نستخدم بعض سلوكيات الـخارطة وبعض سلوكيات القائمة داخل viewController ، آيش الحل ؟
نستخدم التصميم الوراثي ؟ غير منطقي لان viewController يجمع نوعين مختلفين وهو بنفسه مستقل عنهم فكيف نحوله الى subclass !!
الطريقة الصحيحة هي استخدام الـ protocol + delegation و يصير بإمكاننا نكييف الـ viewController مع الـ UITableViewDelegate و UITableViewDataSource و MKMapViewDelegate. بهذي الحالة ، احنا خصصنا الـ viewController بأنه يكون المسؤول عن الآتصال ب MKMapView و tableView عند الحاجة.
الـ delegation وسيلة اتصال class/object ب آخر. وسيلة الاتصال تصير اثناء استخدام التطبيق : اما عن طريق الضغط على الشاشة او تحريك الصفحة لفوق او تحت ( scroll down or up ) او غيرها.
الصورة توضح كيفية الـ delegation او التواصل بين الـ classes
وفي مثالنا ، هذي الصورة توضح الـ delegation
الـ delegate و dataSource بالضبط نفس الشي ، لكن delegate مسؤول عن التحكم بالواجهة و dataSource مسؤول عن البيانات واستدعائها.
************************************************************************************************************************************************
إيش التصميم او الطريقة المناسبة لو كان تطبيقي فقط لعرض قائمة اسماء ، التطبيق يحتوي على عنصر واحد اللي هو قائمة ( tableView ) فقط ؟
في هذي الحالة نستخدم التصميم الوراثي ، ننشئ ملف ويكون من نوع او subclass لـ UITableViewController. بهذي الطريقة ما نحتاج الـ delegate و الـ dataSource ، بمعنى اصح ما نحتاج الـ protocol والـ delegation لان كل السلوكيات تورث او نقدر نوصلها عن طريق التوريث .. لكن دائم حاول تستخدم viewController و الـ delegation لان لو احتجت ان تعدل او تضيف عناصر مثل UIButton , UISegmentedController في المستقبل ما راح تقدر تعدل او تضيف على UITableViewController فتضطر لحذف كل شي ..!!
اتمنى يكون الشرح سهل وواضح 🙂
Ali Majrashi: اجابة رهيبه ومفصله لو تنزل مقالات بتكون ابداع اهنيك
Ahmed: جزاك الله خير ، بحاول بإذن الله
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !