سؤال

هل يمكن لأحد أن يشرح معنى someViewController.delegate = self و self.delegate؟أين يساعدوننا؟

هل كانت مفيدة؟

المحلول

المندوبون إرسل رسائل لك.

على سبيل المثال: إذا كنت تستخدم مندوب التسارع ، فستحصل على رسائل حول مقياس التسارع.

إذا كنت تستخدم مندوبًا جديدًا للكشف عن Neutrino ، فستحصل على رسائل حول أي نيوتريونات تم اكتشافها في المنطقة.

إذا كنت تستخدم النوافذ المنبثقة ، فسترسل لك المنبثقة رسائل. والطريقة التي يتم بها ، هي مع مندوب المنبثقة. هناك العديد من الأمثلة.

لذلك ، يرسل المندوبون الرسائل.

بكل بساطة.

قد تسأل ، "أين ترسل هذه الرسائل؟"

الجواب هو: إنه يرسل الرسائل إلى المكان الذي تقوم فيه بتعيين ".delegate".

عندما تقوم "بتعيين المندوب" ، فإن ما تفعله هو المكان الذي تريد أن تذهب فيه الرسائل.

لذلك،

blah.delegate = سوف يرسل AmazingPlace الرسائل إلى "AmazingPlace".

blah.delegate = في مكان ما سوف يرسل الرسائل إلى "مكان ما".

blah.delegate = سوف يرسل الذات الرسائل ...... لك.

في كثير من الأحيان ، تريد أن تأتي الرسائل إلى "أنت" ، لذلك تقول فقط "blah.delegate = self"

إنه خطأ شائع جدًا ، أن ننسى خط الكود هذا.

إذا نسيت هذا السطر من التعليمات البرمجية ، فأنت محشو. الرسائل تذهب لا مكان, ، وتركت تخدش رأسك في محاولة لمعرفة الخطأ الذي حدث.

شيء آخر عليك القيام به: عندما تستخدم مندوبًا ، يجب أن تعلن مسبقًا ، أنك تريد استخدام المندوب.

كيف يتم فعل ذلك؟

في الأيام الخوالي مع Objective-C ، فعلت هذا فقط ...

@interface AppDelegate_Pad : NSObject <UIApplicationDelegate>
@interface BigTop : UIViewController <ASIHTTPRequestDelegate,
                                        UIPopoverControllerDelegate>
@interface Flying : UIViewController <UIAccelerometerDelegate>

يمكنك أن ترى أن "Bigtop" يريد استخدام اثنين من المندوبين ، وهما asihtprequestdelegate و uipopovercontrollerDelegate. في حين أن "الطيران" يريد فقط استخدام مندوب واحد - فهو يريد استخدام مقياس التسارع.

في سويفت, ، لا يمكن أن يكون الأمر أسهل - لديك فاصلة فقط ثم البروتوكولات:

 class YourClass:UIViewController, SomeDelegate, AnotherDelegate

لا يمكنك فعل الكثير على iPhone دون استخدام المندوبين في كل مكان.

يتم استخدام المندوبين في كل مكان وطوال الوقت في iOS.

من الطبيعي تمامًا أن يستخدم الفصل العشرات من المندوبين.

في مثال "الطيران" أعلاه ، في مكان ما في رمز "الطيران" ، يجب أن يقول ...

[[UIAccelerometer sharedAccelerometer] setDelegate:self];

في حالة Bigtop ، سيتعين عليه تعيين المندوب في مكان ما لـ Asihtprequests ،

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:gid forKey:@"gid"];
[request setPostValue:nom forKey:@"nom"];
[request setDelegate:self];

(لا تنسى في الأيام الخوالي مع الهدف-C ، x.delegate=self كان بالضبط نفس الشيء [x setDelegate:self].)

في الوقت الحاضر مع سويفت أنت ببساطة الكتابة

  x.delegate = self

وهذا كل ما في الأمر.

هذا ما تفعله. المندوبون إرسل رسائل. يجب ان تقول أين تريد أن تذهب الرسائل. عادةً ، تريدهم أن يذهبوا إلى "أنت" ، لذا في هذه الحالة ، تقول ببساطة x.delegate=self.

أتمنى أن يساعد ذلك.

نصائح أخرى

Delegate يستخدم لتمرير/توصيل البيانات/الرسالة ب/ث كائنين من الفئات.هنا، tableView(المرسل) يرسل البيانات/الرسالة إلى viewController(المتلقي).النظر في مثال للتنفيذ UITableView في العرف viewControllerهنا، UITableViewDataSource & UITableViewDelegate هي في الواقع بروتوكولات.للأسف، UIKit Framework ليس مفتوح المصدر.لكني سأؤكد هذا ما يحدث داخليًا بعد إحالة العديد من المقالات.

البروتوكول يشبه مدرب كرة السلة مع بعض المتطلبات فيه.هو / هي تخبر اللاعبين مثل الفصل والبنية والتعداد what to do? باستخدام تلك المتطلبات.لكنه / هي doesn't knows how to do?بأنفسهم.لذلك، يجب على الفئة أو البنية التي تتوافق مع هذا البروتوكول أن توفر التنفيذ لتلك المتطلبات أثناء تحقيق رمي الكرة.

protocol UITableViewDelegate {
 func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}

يقال أن البروتوكول هو بروتوكول DataSource، فهو يحتوي دائمًا على الوظائف المطلوبة مع "نوع الإرجاع" كما هو موضح أدناه.

protocol UITableViewDataSource {
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
 func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
}

تنفيذ UITableView داخل viewController المخصص

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()    

    override func viewDidLoad {
      tableView.delegate = self
      tableView.dataSource = self
    }

هنا، tableView بمثابة المفوض (المرسل) & viewController object i.e (self) كمندوب (متلقي).

من أجل الحصول على UITableView في viewController.يجب أن يتوافق مع كلا البروتوكولين.

لذا، viewController قام كائن الفئة بتنفيذ جميع الوظائف المطلوبة لكلا البروتوكولين.الآن self يمكن استخدامها إما كما UITableViewDelegate اكتب أو UITableViewDataSource اكتب لأنه يمكن استخدام البروتوكول كنوع لكائن من الفئة يتوافق معه.الآن، كلا من خصائص tableView أي delegate & dataSource تم تعيينهم ل self لأنه يحتوي على نفس أنواع البروتوكولات المعنية.

يتم تنفيذ الوظائف غير الاختيارية لكلا البروتوكولين في viewController كائن فئة على النحو التالي

بروتوكول UITableViewDelegate المهام

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
// Do further processes like pushing or poping another viewController
}

بروتوكول UITableViewDataSource المهام

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
 }

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
 }

1) عندما يقوم المستخدم بتحديد صف في القسم بعد ذلك tableview(المرسل) أي UItableView() يدعو UITableViewDelegate func أدناه موضح عن طريق تمرير البيانات إلى المعلمات tableView & indexPath الذي يقيم فيه viewController الكائن (المتلقي) من خلاله delegate ملكية.الآن viewController يستخدم تلك البيانات التي تم تمريرها لإجراء المزيد من العمليات مثل الدفع أو الانتقال إلى viewController المخصص الجديد.

tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

2) وظائف في الداخل UITableViewDatasource يوفر البروتوكول بيانات مخصصة ل tableview(مرسل).ال tableview يسأل viewController كائن عن طريق استدعاء وظائف مصدر البيانات مع تمرير البيانات إلى المعلمات tableView & indexPath الذي يقيم فيه viewController الكائن (المتلقي) من خلاله datasource ملكية.الآن viewController يستخدم تلك البيانات التي تم تمريرها ويعيد البيانات المخصصة مرة أخرى tableview.الآن tableview يستخدم هذه البيانات لإنشاء "10" خلايا في قسم ونوع "خلية" في مسار الفهرس

tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"

وأخيرا، كله UIKit Framework يستخدم أنماط تصميم المفوض ومصدر البيانات في جميع فئاته مثل UIApplication, UITableView, UICollectionView, UITextField وما إلى ذلك لتوصيل البيانات.للأسف، UIKit Framework ليس مفتوح المصدر.

إذا لم تساعد إجابة بورن على أي حال .. فإن المندوب هو في الأساس رد فعل حدث ما على كائن ويقول ". يتم تحديد صف في TableView بواسطة طريقة مندوب TableView "DeSeSelectRowatIndexPath" ... وإذا كان لدى ViewController عرض TableView .. و "didelectrowatindexpath" يتم تعريفه في ViewController فقط ، عندها سنقول ... tableview.delegate = self ". ... و "self.aneing" اعتاد أن يقولوا أن "أي شيء" هو خاصية ذاتية .. على سبيل المثال nsstring* أي شيء ؛ property (nonatomic ، الاحتفاظ) nsstring* أي شيء ؛

ثم "الذات ، أي شيء"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top