Как запустить универсальное приложение на симуляторе iPhone 3.1.3?

Я работаю над новым приложением, которое я хочу сделать универсальным для iPhone и iPad. Я начал с мастера "Создание оконного приложения", и он создавал отдельных делегатов в группах "iPhone" и "iPad". Так как я уже был достаточно знаком с iPhone dev, я сделал эту часть своего проекта, и теперь я готов сделать кое-что для iPad.

Итак... Я начал с добавления UISplitViewController к моему делегату на iPad, переключил Active SDK на 3.2, и это работает! Но когда я переключаюсь обратно на 3.1.3 и пытаюсь запустить его в симуляторе, Build and Go терпит неудачу. Для начала я вижу:

... путь.../iPad/AppDelegate_Pad.h:13: ошибка: ожидаемый список спецификаторов-спецификаторов перед UISplitViewController

У меня установлен базовый SDK 3.2, а в качестве цели развертывания - 3.1.3. Я думал, что этого было достаточно. Но я также нашел в документации этот метод для условной компиляции:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
   MyIPadViewController* vc;
// Create the iPad view controller
#else
   MyIPhoneViewController* vc;
// Create the iPhone view controller
#endif

Так нужно ли это делать везде? Кажется, что нужно добавить очень много кода (от которого я все равно скоро избавлюсь для 4.0), поэтому я чувствую, что, должно быть, что-то делаю не так. И я даже не представляю, как это работает для таких вещей, как объявления @property или @synthesize.

tl; dr версия вопроса - я где-то пропустил настройку?

3 ответа

Решение

Наоборот. Универсальное приложение запускает один и тот же двоичный файл на iPhone и iPad, поэтому вы не можете использовать условную компиляцию для различения двух версий. Но вам нужно использовать макрос, который Apple цитирует в документации:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    // iPad-specific code
} else {
    // iPhone-specific code
}

Я использую эту функцию C, чтобы помочь сохранить код кратким:

BOOL isPad() {
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
}

Еще одна вещь, которую я делаю, когда у меня разные xib-файлы для iPhone против iPad. У меня есть функция stripPadSuffixOnPhone(), которая помогает упростить код:

// Load/create the Delete table cell with delete button
self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") 
                           ClassName:@"DeleteCell" 
                   Owner:self];

Такие вещи могут сделать кодирование более простым и намного менее условным. Тем не менее, все равно придется проверить все дважды.

Вот что работает для меня:

  1. Создайте свое приложение, используя SDK 3.2.
  2. Переключите активный SDK на iPhone Simulator 3.1.3 (или любой другой).
  3. В меню "Выполнить" выберите "Отладка" (не "Сборка и отладка").

Двоичный файл, созданный в соответствии с 3.2, будет установлен в симуляторе 3.x без перекомпиляции. Когда вы закончите, не забудьте установить активный SDK обратно на 3.2.

Другие вопросы по тегам