Как каждый заставляет UI_USER_INTERFACE_IDIOM () работать с iPhone OS SDK <3.2

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 подход к обнаружению устройств во время выполнения, что я делаю неправильно? Кто-либо следовал за использованием этого подхода к обнаружению устройств?

32
задан drootang 5 April 2010 в 03:44
поделиться

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-conditional -code-in-universal-iphone-ipad-applications /

24
ответ дан 27 November 2019 в 20:39
поделиться

Это то, что я использую:

- (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.

14
ответ дан 27 November 2019 в 20:39
поделиться

Я считаю, что ответ заключается в том, что не пытайтесь запустить код на симуляторе iPhone 3.1.3 или более ранней версии. Всегда компилируйте с SDK версии 3.2. Симулятор iPhone 3.2 даст вам симулятор iPad, или скомпилируйте для iPhone Device 3.2 и поставьте приложение на телефон для тестирования.

Нет способа скомпилировать с SDK 3.2 и использовать симулятор 3.1.3 или более ранней версии.

5
ответ дан 27 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: