الهدف C ، كيفية الاستعلام إذا كان كائن من فئة معينة

StackOverflow https://stackoverflow.com/questions/2597883

  •  25-09-2019
  •  | 
  •  

سؤال

أنا مستمد من TableViewCell. عندما أقوم بالاستعلام عن عرض الجدول حول مسار الفهرس ، فإنه يعيد UitableViewCell. كيف أجد ما إذا كان هذا الكائن أحد نوعي المخصص "CustomCell"؟

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

المحلول

if ([cell isKindOfClass:[CustomCell class]]) {
    [(CustomCell*)cell customCellMethod];
}

نصائح أخرى

if ([cell isKindOfClass:[CustomCell class]]) {
   // ...
}

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

لا أم ما ، من الأفضل أن يعتمد تصميمه على واجهة (أ @protocol في Objective-C Speak) من فئة لأنه يساعد على فصل التصميم الخاص بك. تحديد أ @protocol مع واجهة برمجة التطبيقات ذات الصلة التي تحتاجها ولديك CustomCell تنفيذ هذا البروتوكول. في الكود الخاص بك يمكنك بعد ذلك الاختبار:

if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
  //...
}

بدلا من اختبار الهوية الطبقية.

إذا كنت بحاجة فقط إلى طريقة واحدة ، يمكنك استخدامها [cell respondsToSelector:@selector(myMethod)].

هناك بالفعل طريقتان يمكنك استخدامهما هنا. الشخص الذي ربما تريده هو isKindOfClass:, ، ولكن هناك طريقة أخرى تسمى isMemberOfClass: وهذا سيعود فقط YES إذا كان جهاز الاستقبال مثيلًا للفئة المقدمة ، فليست مثيلًا للفئة الفرعية.

على سبيل المثال ، إذا DerivedClass هي فئة فرعية من BaseClass, ، هنا هي نتائج كل طريقة:

BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top