كيف يمكنني استخدام تعدد الأشكال للسماح لطريقة ما بقبول فئات متعددة، ولكن مع IBOutlets؟
سؤال
لدي طريقة محددة تقبل أ UIView
كائن، وأريد تمرير كائنات إليه يمكن أن تكون من إحدى فئتين.لذلك قل أنه يقبل أ UIView
يمثل حيوانًا، أريد أن أكون قادرًا على اجتياز أ DogView
و أ CatView
أو غيرها من فئات الحيوانات المحتملة.
ضمن هذه الطريقة أريد تعيين nameLabel
المنظر الذي تمتلكه جميع الحيوانات.كيف أقوم بإعداده حتى أتمكن من القيام بذلك؟
كان رد فعلي الأول هو الحصول على فئة ممتازة (مثل AnimalView
) التي لديها nameLabel
متغير عليه، ثم صنفه فرعيًا لكل حيوان جديد.ومع ذلك، إذا كنت أريد nameLabel
لكي أكون منفذًا، لا يبدو الأمر قابلاً للضبط لأنني لا أستطيع الحصول على المتغير في كل فئة فرعية لتوصيل العرض إلى IB.
ثم حاولت أ Protocol
, ، لكن هذا ليس متعدد الأشكال ولن أتمكن من الوصول إلى خاصية nameLabel من خلال فئة فائقة عامة، هل يمكنني ذلك؟على عكس Objective-C، لم أتمكن من طلب ملف UIView <ProtocolName>
ومن ثم سيسمح لي أن أطلب ذلك.
كيف يجب أن أفعل هذا؟أريد فقط أن أكون قادرًا على تمرير أنواع مختلفة من الكائنات وأن تكون متوافقة مع Interface Builder.هل يجب أن أتعامل مع الأمر بشكل مختلف تمامًا؟
المحلول
يمكنك توصيل منفذ label
إلى مختلف viewControllers
مع الخاص بك SuperClass
من لوحة القصة إذا كان لديك مختلفة viewControlelrs
في القصة المصورة إعادة تعيين بواسطة Subclasses
(مشتقة من أسماء SuperClass) في القصة المصورة.
1) فقط حدد
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
ممثل view controller1
في القصة المصورة المستمدة من SuperClass
SubClass2
يمثل آخر view controller2
في القصة المصورة المستمدة من SuperClass
2) من الذهاب إلى Assistant Editor
ومفتوحة SuperClass
جانب واحد والجانب الآخر view controller1
وتوصيل المنفذ من SuperClass
ل label
في لوحة القصة في view controller1
.اسحب من SuperClass
label
إلى لوحة القصة في view controller1
3) الآن مفتوح مرة أخرى SuperClass
جانب واحد والجانب الآخر view controller2
وتوصيل المنفذ من SuperClass
ل label
في لوحة القصة في view controller2
.اسحب من SuperClass
label
إلى لوحة القصة في view controller2
إذا قمت بالنقر فوق SuperClass
منفذ مما ستشاهده علامتين متصلتين بوحدات تحكم عرض مختلفة
نصائح أخرى
أعلن IBOutlet
في superclass
, AnimalView
.ثم في Interface Builder، بمجرد تعيين الإعداد المخصص UIView's
الطبقة في مفتش الهوية ليكون DogView
, ، انتقل إلى مفتش الاتصالات و nameLabel
سيكون هناك.
@interface Parent : UIView
@property (nonatomic,weak) IBOutlet UILabel *nameLabel;
@end
@interface Child : Parent
@end