كيف يمكن للمرء الحصول على ui_user_interface_idiom () للعمل مع iPhone OS SDK <3.2

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

  •  24-09-2019
  •  | 
  •  

سؤال

تنصح Apple باستخدام الكود التالي لاكتشاف ما إذا كان يعمل على iPad أو iPhone/iPod Touch:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  // The device is an iPad running iPhone 3.2 or later.
  // [for example, load appropriate iPad nib file]
}
else {
  // The device is an iPhone or iPod touch.
  // [for example, load appropriate iPhone nib file]
}

المشكلة هي أن ui_user_interface_idiom () و uiuserinterfaceidiompad لم يتم تعريفهم في SDKs قبل 3.2. يبدو أن هذا يهزم تمامًا الغرض من هذه الوظيفة. لا يمكن تجميعها إلا على iPhone OS 3.2 (لا يمكن تشغيل iPhone OS 3.2 إلا على iPad). لذلك إذا كان بإمكانك استخدام UI_USER_INTERFACE_IDIOM () ، فستكون النتيجة دائمًا الإشارة إلى جهاز iPad.

إذا قمت بتضمين هذا الرمز ونظام التشغيل OS 3.1.3 المستهدف (أحدث جهاز iPhone/iPod Touch OS) من أجل اختبار رمز التطبيق العالمي المتجه إلى جهاز iPhone ، فستحصل ، عند التجميع لجهاز iPhone Simulator 3.1.3.

إذا كان هذا هو النهج الموصى به على حدة في اكتشاف جهاز وقت التشغيل ، فما الخطأ الذي أفعله؟ هل نجح أي شخص في استخدام هذا النهج في كشف الجهاز؟

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

المحلول

أفعل هذا للحصول على الرمز لتجميع في كل من 3.1.3 و 3.2:

BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
if (iPad) {
// iPad specific code here
} else {
// iPhone/iPod specific code here
}

لقد كتبت أيضًا منشورًا سريعًا للمدونة حول هذا الموضوع هنا:http://www.programbles.com/2010/04/03/compiling-condition-in-universal-iphone-ipad-applications/

نصائح أخرى

هذا ما أستخدمه:

- (BOOL) amIAnIPad {
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
        if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
            return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    #endif
    return NO;
}

هذا يتجمع بشكل مشروط ، بحيث لا يزال بإمكانك البناء لـ 3.0 SIM. ثم يتحقق لمعرفة ما إذا كانت فئة Uidevice تستجيب للمحدد. إذا فشل أي من هذه ، فهو ليس جهاز iPad.

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

هذا هو الحل ل مدة العرض كشف:

#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

بعد ذلك يمكنك اختباره بسهولة في أي مكان في الكود الخاص بك:

if (isIPhone) { ... }

الفرق بين هذا واستخدام #if / #ifdef هو أن هذا هو اختبار وقت التشغيل ، في حين أن #if هو اختبار وقت الترجمة.

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

إذا كانت مشكلتك هي أخطاء في وقت التجميع ، فيجب عليك فقط التجميع مقابل الإصدار الأخير من SDK (انظر أيضًا كيفية الوصول إلى إطار عمل ضعيف في iOS؟).

أعتقد أن الإجابة هي ببساطة لا تحاول تشغيل الرمز على iPhone محاكاة 3.1.3 أو قبل ذلك. تجميع دائما مع 3.2 SDK. سيحصل لك iPhone Simulator 3.2 على محاكاة iPad ، أو تجميع جهاز iPhone 3.2 ووضع التطبيق على الهاتف لاختباره.

لا توجد طريقة لتجميعها مقابل 3.2 SDK واستخدام محاكي 3.1.3 أو سابقًا.

بدلاً من أي أشياء قائمة على المترجم أستخدمها:

- (BOOL)deviceIsAnIPad {
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    //We can test if it's an iPad. Running iOS3.2+
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        return YES; //is an iPad
    else 
        return NO; //is an iPhone
else 
    return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone
}

إعلان باستخدام هذا

#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif

ثم استخدم الشيك على النحو التالي

#define DetailLabel_PosX (IS_IPAD ? 200 : 160)

هناك أيضًا بعض التعريف للتحقق من iPhone 5

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0 )
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0 )

يبدو أن هذا يهزم تمامًا الغرض من هذه الوظيفة. لا يمكن تجميعها إلا على iPhone OS 3.2 (لا يمكن تشغيل iPhone OS 3.2 إلا على iPad). لذلك إذا كان بإمكانك استخدام UI_USER_INTERFACE_IDIOM () ، فستكون النتيجة دائمًا الإشارة إلى جهاز iPad.

هذا غير صحيح تماما. يمكن أن يكون تجميع وانتاج على قاعدة SDK من 3.2 ، ولكن يمكن أن يكون يركض على أي نظام تشغيل ، إذا قمت بتعيين هدف النشر بشكل مناسب.

يمكن استخدام UI_USER_INTERFACE_IDIOM () و UiUserInterfaceIdiompad على iOS3.2 وما فوق ، الجزء المهم هو "الأعلى". بالتأكيد. iOS3.2 مخصص فقط لـ iPad ، ولكن iOS4.0 وما بعده يعمل على كل من أجهزة iPhone و iPad ، وبالتالي فإن الشيك ليس بلا معنى كما تعتقد.

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