سؤال

جميع أحفاد صفي المحدد يجب أن يكون لديهم 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

enter image description here

الآن فتح مرة أخرى 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 في الفئة الفرعية
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top