كيف أقوم بتصنيف متغير باستخدام IBOutlet؟
سؤال
جميع أحفاد صفي المحدد يجب أن يكون لديهم UILabel
المتغيرات الخاصة.لذلك لدي في صف والدي var label: UILabel
.أريد الحصول عليه في الفئة الفرعية أيضًا، ولكن باعتباره IBOutlet
.كيف أقوم بهذا العمل؟
أضفت IBOutlet
بنفس الاسم، وأضيف ضعيفًا إلى كلا الإعلانين المتغيرين.لكنني تلقيت خطأً بشأن "لا يمكن التجاوز باستخدام خاصية مخزنة".
كيف يجب أن أفعل هذا؟وهل من الممكن ألا أضطر إلى إنشاء مثيل لإصدار الفئة الفائقة لأنني أريدها فقط للفئة الفرعية؟
المحلول
فقط أضف تعديل الأجيال في Superclass.
نصائح أخرى
من خلال القيام بذلك أنت re-declaring
ال label
الملكية في فئة فرعية. IBOutlet
هي مجرد فكرة مترجم للعمل مع Interface Builder.
في سويفت الخصائص المخزنة لا يمكن تجاوزها أو إعادة تعريفها في فئة فرعية.لا يمكن توريثها إلا.
ومع ذلك يمكنك تجاوز getter
و setter
من أ properties
في الفئات الفرعية لتوفير عمليات تحقق أو وظائف إضافية.ارجع إلى دليل سويفت: تجاوز getter setter
تحتاج إلى الإعلان عن الممتلكات الخاصة بك في superClass مع IBOutlet
.
أو يمكنك إنشاء خاصية مختلفة في فئتك الفرعية.كما أنه لا يوجد أي معنى أيضًا إذا كنت تقوم بتوصيل الممتلكات الخاصة بك في إحدى الفئات الفرعية (قد يكون للفئة الفائقة فئات أخرى) ولا تقدم هذا التنفيذ إلى فئات فرعية أخرى من فئتك الفائقة.
يحرر:يمكنك أيضًا ضبط label
منفذ لاثنين مختلفة viewControllers
من الخاص بك SuperClass
من لوحة القصة إذا أعطيت Subclasses
الأسماء في القصة المصورة لوحدات تحكم عرض مختلفة.
فقط حدد
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
ممثل view controller1
في القصة المصورة المستمدة من SuperClass
SubClass2
يمثل آخر view controller2
في القصة المصورة المستمدة من SuperClass
من الذهاب إلى Assistant Editor
ومفتوحة SuperClass
جانب واحد والجانب الآخر view controller1
وتوصيل المنفذ من SuperClass
ل label
في لوحة القصة في view controller1
.اسحب من SuperClass
label
إلى لوحة القصة في view controller1
الآن فتح مرة أخرى SuperClass
جانب واحد والجانب الآخر view controller2
وتوصيل المنفذ من SuperClass
ل label
في لوحة القصة في view controller2
.اسحب من SuperClass
label
إلى لوحة القصة في view controller2
إذا قمت بالنقر فوق SuperClass
منفذ مما ستشاهده علامتين متصلتين بوحدات تحكم عرض مختلفة
على أن الجواب القصير هو ببساطة:
"فقط إضافة
@IBOutlet
التعديل في الفائقة."
ملاحظة واحدة على الرغم من:إذا كنت سوف يكون تعريض ViewController التي @IBOutlet
ويعرف عبر إطار (مع قرطاج), سوف تحتاج إلى إضافة public
تنسب إلى تعريف متغير. تحرير:بدلا من, استخدام open
وصول الكلمة`.
دعونا نقول لديك تحكم عرض CustomViewController subclassing UITableViewController, والتي سوف نبني في قرطاج-تسليم الإطار.كل شيء يجب أن تكون في متناول المستهلك التطبيق يجب أن يكون معلم public
:
public class CustomViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!
الشيء الجميل في هذا النهج (و أنا تماما على متن الطائرة مع هذه الحالة استخدام) هو أنه يمكنك القيام IBOutlet رسم الخرائط في واجهة البناء على الفائقة ، ثم التبديل فئة من مكان الحادث إلى فرعية ، مع الحفاظ على جميع من تعيينات.
E. g.: SubclassedCustomViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
أدرك أن هذا السؤال نشر منذ فترة، ولكن منذ أن كافحت مع نفس القضية وأخيرا توصلت إلى حل، أحسبت أنني ما زلت نشرت نتائجي ...
أفهم المشكلة لتكون كما يلي (على الأقل هذا هو الذي قمت بحله):
كيفية وجود فصل من الفئة ب، مع كل فئة لها ملف XIB الخاص به مع بعض خصائص iboutlet الشائعة؟ الهدف من أن يكون قادرا على مقبض الطبقة الفائقة الإجراءات ذات الصلة إلى iBeutlets الشائع في الفئة الفرعية (ES)، في حين لا يزال قادرا على استخدام منشئ الواجهة لتصميم الواجهة ل Subclass (ES). *
من أجل القيام بذلك:
- جعل اتصالات iboutlet في superclass من SuperClass 'XIB الملفات
- قم بإجراء اتصالات iBoutlet في الفئة الفرعية من XIB الفئة الفرعية الملفات، مع نفس أسماء خاصية iBoutlet كما في Superclass لأولادك التي تحتاج إلى الوراثة.
- حذف إعلان متغيرات iBoutlet في الفئة الفرعية