ما التهيئة (المراكز) لتجاوز الفئة الفرعية للوقت القديم
-
09-09-2019 - |
سؤال
انا املك UITableViewController
فئة Subclass التي هي مثيل لها، اعتمادا على المكان الذي يتم استخدامه، في NIB أو عبر التعليمات البرمجية. في كلتا الحالتين، أريد أن أقوم بتخصيص في طريقة التهوية. هل هذا يعني أنني بحاجة إلى تنفيذ كل من initWithNibName:bundle:
و initWithCoder:
, ، وستسمح كل طريقة لها تهيئة سوبر المعني؟
في حين أنني لست بحاجة إلى هذا الآن، ماذا لو كنت أريد أيضا أن أكون قادرا على إنشاء مفهتمام وحدة التحكم مع initWithStyle:
ب هل سأحتاج بعد ذلك إلى 3 طرق تابعة مختلفة تكرار نفس السلوك؟
يبدو أن هذا ينتهك اتفاقية التهوية المعينة بأكملها، حيث سيكون هناك أساسا 3 تهيئة منفصلة لا ينتهي بهم المطاف في استدعاء طريقة إتتزال مشتركة. أم أن هناك طريقة لإنشاء تهيئة مخصصة مشتركة أثناء دعم 3 طرق إنشاءات مختلفة؟
المحلول
استند ارتباكي على الاعتقاد الخاطئ بأن كل فئة يجب أن يكون لها تهيئة واحدة مخصصة. هذا ليس صحيحا، وفي حالة UITableViewController
هناك 3 عمليات تهيئة مخصصة (بقدر ما أستطيع أن أقول):
initWithStyle:
أعلن محلياinitWithNibName:bundle:
موروث منUIViewController
initWithCoder:
من اعتمادNSCoding
بروتوكول
تحتاج إلى تجاوز 1 او اكثر من هذه في الفئة الفرعية اعتمادا على كيفية إنشاء مثيل الفرعية الخاصة بك. في حالتي، اضطررت إلى تطبيق رقم 2 و # 3 نظرا لأن الفصل يمكن تحميله من NIB، أو إنشاء مثيل لك التعليمات البرمجية مع المرجع إلى NIB. (أتصور أنه نادر بأن تستخدم كلاهما initWithStyle:
و initWithNibName:bundle:
لفئة واحدة.)
لقد وجدت أبل إرشادات الترميز للكاكاو معاون، مساعد، مفيد، فاعل خير.
نصائح أخرى
داخليا،
- JitalViewController's
-initWithStyle:
يدعو السوبر-init
ثم تعيين_tableViewStyle
إيفار. - uiviewcontroller
-init
ما عليك سوى المكالمات-initWithNibName:bundle:
مع الحجج الافتراضية. - ayabicviewcontroller. لا تجاوز
-initWithNibName:bundle:
.
لذلك، إذا تجاوزت -initWithNibName:bundle:
ومن بعد -initWithStyle:
سوف تعتمد التغيير أيضا. بالطبع، للعب آمنة (كما يجب ألا تعتمد على تفاصيل التنفيذ)، تجاوز كل منهما.
(وليس هناك حاجة لتجاوز -initWithCoder:
ما لم تكن قوة الأمم المتحدة / أرشفة الحالات.)
للتوضيح، initWithStyle:
, ، مستخدم UITableViewController
يتم نشر المهجع المنشور فقط في المستندات، هو المهجع المعين الواحد المعين.
initWithNibName:bundle:
يرث من UiviewController وهو المهجع المعين لهذه الفئة. على هذا النحو، وفقا لإرشادات الكاكاو، UITableViewController
يجب تجاوز هذه الطريقة (عن طريق تنفيذها). ومع ذلك، هذا لا يجعلها تهيئة محددة UITableViewController
.
initWithCoder:
هو، كما تشير، بتهيئة مخصصة ضمنية من NSCoding
.
ينفذ:
- (void) viewDidLoad
والقيام تهيئة المكون الخاص بك هناك.
لديها ميزة القيام بالتهيئة فقط عند طلب العرض بالفعل.
أو مجرد إجراء طريقة إعداد منفصلة تم استدعاؤها من قبل جميع المهوانين.
إضافة إلى الوظائف أعلاه هذه المرجع -initwithcoder:
إذا أضفت إضافة وحدة تحكم عرض إلى الوالد الخاص بها عبر منشئ واجهة (على سبيل المثال: إذا كانت وحدة تحكم العرض متصلة بوحدة تحكم شريط تبويب في منشئ واجهة)، فأنت بحاجة إلى تجاوز -InitWithoder.
(سيتم استدعاء inaitwithnibname إلا عند إنشاء وحدة تحكم عرض برمجيا.)