خلق UIViewController مع initWithNibName: حزمة: أو عن طريق تتصرف بشكل مختلف IBOutlet

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

سؤال

ولقد وجدت سلوك غريب، وترغب في أن تكون أوضح ما التأكيد وأنا على صنع ما هو خطأ.

في فئة AppDelegate مشروع WindowBased تم إنشاؤها حديثا، وأنا إضافة UIViewController إلى النافذة.
أستطيع أن أفعل ذلك بطريقتين مختلفتين:
 - مع IBOutlet. في IB، أنا ببساطة وضح على UIViewController، تعيين فئتها لTestViewController وتوصيله (السيناريو ألف من التعليمات البرمجية).
 - خلق UIViewController مع رمز (السيناريو B).

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    

#define USE_IBOUTLET YES // Comment this line to switch to scenario B

#ifdef USE_IBOUTLET
    // Scenario A

    [window addSubview:theTestViewController.view];
    [window makeKeyAndVisible];
#endif


#ifndef USE_IBOUTLET
    // Scenario B

    TestViewController *theTestViewControllerProgrammatically;

    theTestViewControllerProgrammatically = [[TestViewController alloc] initWithNibName:nil bundle:nil];

    // According to Apple: "It is a good idea to set the view's frame before adding it to a window.", so let's do it
    [theTestViewControllerProgrammatically.view setFrame:[[UIScreen mainScreen] applicationFrame]];

    [window addSubview:theTestViewControllerProgrammatically.view];

    [window makeKeyAndVisible];
#endif
}

وأنا لم أفعل أي التخصيص من وجوه في IB، يجب أن يكون لديك نفس السلوك في كل سيناريو.

والسيناريو A، تعمل باستخدام IBOutlet كما هو متوقع.
لكن السيناريو B لديه المشاكل التالية:
 - إن الرأي ليس في المكان المناسب (20 بكسل عالية، وشريط المغطاة)
.  - لا تغيير حجم عرض بشكل صحيح (على سبيل المثال، في محاولة لتبديل شريط الحالة في الدعوة)

لماذا؟

والرمز البريدي المحفوظات المشروع هنا إذا كنت ترغب في إعادة إنتاج المشكلة: HTTP : //dl.dropbox.com/u/1899122/code/ProtoWindowBasedStrangeness.zip

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

المحلول

وهذا سوف يبدو حقا سخيفة بعد إجاباتي ينضب طويلة، ولكن المشكلة التي واجهتك هو بسيطة لإصلاح (برمجيا).

وهذا السطر:

[theTestViewController.view setFrame:[[UIScreen mainScreen] applicationFrame]];

يجب أن يكون في الواقع:

[theTestViewControllerProgrammaticaly setFrame:[[UIScreen mainScreen] applicationFrame]];

وأنت ووضع إطار لمجموعة VC بواسطة IB، وليس عن طريق واحد قمت بإنشائه برمجيا.

وعلى أي حال - ومن الجدير بالذكر أن كل تعليقاتي لا تزال سارية! لا تزال هناك بعض الأشياء التي عليك القيام به برمجيا إذا كنت لا تستخدم أدوات تحكم IB (على سبيل المثال، إنشاء عناصر شريط الملاحة)

وبول

نصائح أخرى

ولقد كان لديها مشكلة مماثلة جدا لك في أن لاحظت الأشياء VC لا يتم إنشاء جميع على قدم المساواة! المشكلة أواجه هو وضع عناصر شريط التنقل، أنا فقط لا يمكن أن يبدو للقيام بذلك عند مالك الملف هو كائن عرض تحكم أنني مثيل برمجيا. أنها لا تعمل إلا إذا الأجسام تحكم I إلغاء الأرشفة IB ل.

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

ما أعتقد يجري هو أن أبل قد خلقت هذه الكائنات تحكم في IB التي هي أكثر قليلا المتخصصة. اقتراح واحد وهذا قد يكون صحيحا هو أن الأجسام IB VC لها سمة يمكنك تعيين هذا لا يوجد لديه ممتلكات المقابلة مباشرة لفئة UIViewController أستطيع أن أرى، لذلك كائنات تحكم IB قد يكون بعض الوظائف الإضافية التي فرعية غير IB-UIViewController لا يمكن الاستفادة من. وبالنظر إلى أن الكائنات في .xib كاملة الكائنات تجميد المجفف، أبل قد قمنا بإدراج جميع أنواع سمات خاصة لا نستطيع أن نرى أو استخدامها في الإصدارات IB بهم منهم - وهذا قد يكون له بعض التأثير على كيفية initialised الكائنات .

وعلى سبيل المثال، في MainWindow.xib الخاص بك، حدد الكائن IB VC ويمكنك ان تحدد سمات عليه من لوحة المفتش، مثل "تغيير حجم عرض من بنك الاستثمار القومي". إذا كنت إلغاء الاختيار هذه وإعادة تشغيل التطبيق الخاص بك، سترى VC تظهر تماما كما هو الحال في السيناريو B. كما لا يمكن التحقق من هذا البند عند سمات من المالك للملف (على الرغم من أنه هو بمثابة UIViewController )، كنت غير قادر على الاستفادة من كل ما تقوم به وحدة تحكم نظرا لتعطيك السلوك الذي تريده.

وكانت نتيجة ذلك هو أنه عند استخدام TestViewController.xib إلى التهيئة الكائن VC بك في التعليمات البرمجية، فإن أيا من محددة IB سمات من VC يتم تعيين، وبالتالي يتم إنشاء UIViewController المستنقع القياسية، وذلك أشياء مثل "تغيير حجم عرض من طرف مستدق "السمة وإعداد الملاحة العناصر لديها لتنفيذها بنفسك.

وأنا لم تجد حتى الآن وسيلة للاستفادة من الوظائف التي تحكم عرض IB لديهم عندما مثيل لهم باستخدام initWithNibName:bundle:nibBundle (انا التخمين انها كل الاشياء الخاص لا نستطيع الوصول)، ولكن نأمل أن هذا قد أعطت لكم نقطة البداية ...

وبطبيعة الحال، يمكن أن تكون خاطئة تماما، وسوف شخص تجعلني تبدو أحمق كاملة!

وبول

وربما في حالة B هذا الرأي ليس على بينة من وجود شريط الحالة. تحتاج إلى تغيير حجم وفقا لذلك وتعديل موقفها لاتخاذ شريط الحالة في الاعتبار. ويتم ذلك عن طريق تغيير الإطار (حجم) وساق (الموقع) خصائص UIView.

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