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.
Если Вы будете включать этот код и будете нацелены на ОС 3.1.3 (новый iPhone/iPod Touch OS) для тестирования ограниченного iPhone универсального кода приложения, то Вы получите ошибки компилятора, так как символы не определяются в 3.1.3 или ранее при компиляции для средства моделирования iPhone 3.1.3.
Если это - рекомендуемый Apple подход к обнаружению устройств во время выполнения, что я делаю неправильно? Кто-либо следовал за использованием этого подхода к обнаружению устройств?
Я делаю это, чтобы получить код для скомпилировать как в версии 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-conditional -code-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.
Я считаю, что ответ заключается в том, что не пытайтесь запустить код на симуляторе iPhone 3.1.3 или более ранней версии. Всегда компилируйте с SDK версии 3.2. Симулятор iPhone 3.2 даст вам симулятор iPad, или скомпилируйте для iPhone Device 3.2 и поставьте приложение на телефон для тестирования.
Нет способа скомпилировать с SDK 3.2 и использовать симулятор 3.1.3 или более ранней версии.