ما التهيئة (المراكز) لتجاوز الفئة الفرعية للوقت القديم

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

سؤال

انا املك UITableViewController فئة Subclass التي هي مثيل لها، اعتمادا على المكان الذي يتم استخدامه، في NIB أو عبر التعليمات البرمجية. في كلتا الحالتين، أريد أن أقوم بتخصيص في طريقة التهوية. هل هذا يعني أنني بحاجة إلى تنفيذ كل من initWithNibName:bundle: و initWithCoder:, ، وستسمح كل طريقة لها تهيئة سوبر المعني؟

في حين أنني لست بحاجة إلى هذا الآن، ماذا لو كنت أريد أيضا أن أكون قادرا على إنشاء مفهتمام وحدة التحكم مع initWithStyle:ب هل سأحتاج بعد ذلك إلى 3 طرق تابعة مختلفة تكرار نفس السلوك؟

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

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

المحلول

استند ارتباكي على الاعتقاد الخاطئ بأن كل فئة يجب أن يكون لها تهيئة واحدة مخصصة. هذا ليس صحيحا، وفي حالة UITableViewController هناك 3 عمليات تهيئة مخصصة (بقدر ما أستطيع أن أقول):

  1. initWithStyle: أعلن محليا
  2. initWithNibName:bundle: موروث من UIViewController
  3. 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 إلا عند إنشاء وحدة تحكم عرض برمجيا.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top