Проверка, существует ли UI_USER_INTERFACE_IDIOM во время выполнения - PullRequest
1 голос
/ 16 апреля 2010

Я работаю над универсальным приложением, которое должно работать на iPad и iPhone. Документы Apple iPad говорят использовать UI_USER_INTERFACE_IDIOM() для проверки, работаю ли я на iPad или iPhone, но наш iPhone 3.1.2 и не определит UI_USER_INTERFACE_IDIOM(). Таким образом, этот код ломается:

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

В Apple SDK Руководство по совместимости они предлагают сделать следующее, чтобы проверить, существует ли функция:

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if(UI_USER_INTERFACE_IDIOM() != NULL &&
  UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

Это работает, но приводит к предупреждению компилятора: «Сравнение между указателем и целым числом». Покопавшись, я понял, что могу заставить предупреждение компилятора исчезнуть со следующим приведением к (void *):

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if((void *)UI_USER_INTERFACE_IDIOM() != NULL &&
  UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

У меня такой вопрос: последний блок кода здесь хорошо / приемлемо / стандартная практика? Я не мог найти кого-то, кто делал бы что-то подобное с помощью быстрого поиска, что заставляло меня задуматься, пропустил ли я ошибку или что-то подобное.

Спасибо.

1 Ответ

6 голосов
/ 16 апреля 2010

Вам нужно создавать приложения для iPad против 3.2 SDK.Как таковой он будет построен правильно, и макрос UI_USER_INTERFACE_IDIOM () все еще будет работать.Если вы хотите узнать, как и почему, посмотрите это в документации - это #define, который будет понят компилятором и скомпилирован в код, который будет корректно работать на 3.1 (и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...