خطأ في تجميع تصحيح أخطاء تصحيح تطبيق iPhone/iPad لاختبار iPhone

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

سؤال

لقد كتبت تطبيق iPhone و iPad Universal يعمل بشكل جيد في جهاز iPad Simulator على XCode ، لكنني الآن أود اختبار وظيفة iPhone. يبدو أنني غير قادر على تشغيل جهاز محاكاة iPhone باستخدام هذا الرمز لأنه يتقدم دائمًا إلى جهاز iPad؟

بدلاً من ذلك ، حاولت الركض على الجهاز وبينما يبدأ في التشغيل ، أحصل على الخطأ التالي:

dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
  Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
  Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST

نظرًا لأن التطبيق مبني برمجيًا بدلاً من استخدام XIB ، فقد قمت بتقسيم منطق الجهاز 2 باستخدام الأسطر التالية في الطريقة الرئيسية:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}

من هذه النقطة ، يستخدمون AppDelegates مختلفًا وقد راجعت رؤوسي لضمان عدم استخدام UisplitView أو مستوردة عبر منطق الهاتف.

كيف يمكنني تجنب هذا الخطأ وهل هناك طريقة أفضل لتقسيم مسارات المنطق الشاملة في هذا التطبيق الذي تم إنشاؤه برمجياً؟

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

المحلول

يتم تشغيل هذا الخطأ لأنك لم تضعف إطار عمل Uikit. أضاف Framework Uikit في iPhone OS 3.2 جهاز UISplitViewController ، وإذا قمت بربطه بشكل طبيعي ، فسيفترض تطبيقك أن هذه الرموز موجودة في 3.0 ، حيث لا تفعل ذلك.

لضعف ارتباط إطار عمل ، ابحث عن هدف التطبيق الخاص بك في Xcode ، وتفقده ، وانتقل إلى علامة التبويب العامة. في أسفل علامة التبويب هذه ، يجب أن تكون قائمة الأطر ، مع عمود للنوع. قم بتغيير النوع الخاص بـ Uikit من الضعيف وإعادة بناء طلبك. يجب أن يعتني بأخطاء وقت التشغيل.

المنطق الشرطي الخاص بك سليم ، لكنني أميل إلى مشاركة مندوب التطبيق والقيام بالتخطيط الخاص بالواجهة إلى أسفل الخط.

(تحديث: 12/21/2011) اعتبارًا من نظام التشغيل iOS 4.2 ، لم تعد بحاجة إلى أطر عمل ضعيفة لمنع أخطاء مثل هذه. مثل يصف ماركو أرينت, ، إذا قمت ببناء مع iOS 4.2 أو أحدث واستهدافها إلى iPhone OS 3.1+ ، فإن الفئات الفردية أصبحت الآن مرتبطة وينبغي أن يكون لها +class طريقة العودة nil إذا كان الفصل غير موجود في الإصدار الحالي من نظام التشغيل.

نصائح أخرى

كنت أواجه خطأً مشابهًا جدًا وكان يقودني المكسرات! :-) البحث لساعات ولم يستطع معرفة ذلك ...

كما قلت ، كان كل شيء على ما يرام عند التشغيل في جهاز محاكاة iPad ولكن عند محاولة اختبار التطبيق على iPhone باستخدام iPhone OS 3.1.2 ، لن يبدأ حتى مع رسالة الخطأ التالية:

mi_cmd_stack_list_frames لا توجد إطارات كافية في المكدس

من خلال التحقق من كل سطر تقريبًا من التعليمات البرمجية ، أدركت أن تخصيص 3.2 فئات مثل UipopoverController أو UISplitViewController (بالفعل داخل رمز iPad الخاص بـ iPad) كان يسبب المشكلة.

لذا بدلاً من IE:

infopopover = [[uipopovercontroller incloc] initWithContentViewController: InfonavController] ؛

أود أن أكتب

infopopover = [[nsClassFromString (@"uipopovercontroller") initWithContentViewController: InfonavController] ؛

وهذا حل مشكلتي! (يمكن أن يكون تصحيح الأخطاء صعبًا للغاية إذا لم تمنحك رسالة الخطأ أي فكرة عن المكان الذي يمكن العثور فيه على الأخطاء ...)

Xcode 8.3 ، iPad 2 (Non Retina) ، Swift 3 Code

ما ساعدني هو:

  • أعد تشغيل Xcode
  • قم بـ "منتج -> نظيف" يحولأمرك
  • إعادة بناء المشروع
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top