2010-05-03 3 views
10

Я работаю над новым приложением, которое я хочу быть универсальным для iPhone и iPad. Я начал работу с мастером «Создать на основе окна» и создал отдельные делегаты приложений в группах «iPhone» и «iPad». Поскольку я уже был хорошо знаком с iPhone dev, я сделал эту часть своего проекта, и теперь я готов сделать некоторые вещи для iPad.Как запустить универсальное приложение на симуляторе iPhone 3.1.3?

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

...path.../iPad/AppDelegate_Pad.h:13: error: expected specifier-qualifier-list before '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 для 4.0), поэтому я чувствую, что должен что-то делать неправильно. И я даже не знаю, как это работает для таких вещей, как @property или @synthesize.

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

+0

Ответ на progrmr более уместен, примите его, чтобы читатели могли легко получить правильный ответ. –

ответ

23

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

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

Так как я добавляю что-то вроде файла заголовка, где я объявляю переменную типа UISplitViewController? У меня должен быть блок if/else? – bpapa

+0

Нет, вы можете просто объявить об этом. Создайте устройство iPhone 3.2, и оно будет работать на вашем устройстве 3.0/3.1. –

+0

Блоки условной компиляции полезны, если вы хотите протестировать свое приложение в симуляторе iPhone 3.1, хотя (потому что 3.2 Simulator не поддерживает запуск универсального приложения в режиме iPhone). –

39

Я использую эту функцию 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]; 

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

+0

Будет здорово, если вы поделитесь своим классом 'Утилиты' с нами! : P :);) – rptwsthi

+2

Они находятся на [github] (https://github.com/progrmr/SDK_Utilities/tree/master/Utils). – progrmr

0

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

  1. Построить приложение с помощью SDK 3.2.
  2. Включите активный SDK в iPhone Simulator 3.1.3 (или что-то еще).
  3. В меню «Выполнить» выберите «Отладка» (не «Сборка и отладка»).

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

+0

. Установка запаса 3.2 SDK удаляет SDK 3.1.x, поэтому вы не могут устанавливать их как активный SDK. –

Смежные вопросы