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

Я работаю над новым приложением, которое хочу сделать универсальным для iPhone и iPad. Я начал с мастера «Создание оконного приложения», и он создал отдельных делегатов приложения в группах «iPhone» и «iPad». Поскольку я уже был достаточно знаком с разработкой для iPhone, я выполнил эту часть своего проекта, и теперь я готов заняться некоторыми вещами для 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 версия вопроса - я где-то пропустил настройку?


person bpapa    schedule 03.05.2010    source источник
comment
Ответ от progrmr более уместен, примите его, чтобы читатели могли легко получить правильный ответ.   -  person Raj Pawan Gumdal    schedule 03.12.2010


Ответы (3)


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

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    // iPad-specific code
} else {
    // iPhone-specific code
}
person Ole Begemann    schedule 03.05.2010
comment
Итак, как мне добавить что-то вроде файла заголовка, где я объявляю переменную типа UISplitViewController? Я должен иметь в нем блок if / else? - person bpapa; 03.05.2010
comment
Нет, вы можете просто заявить об этом. Выполните сборку для iPhone Device 3.2, и она будет работать на вашем устройстве 3.0 / 3.1. - person Ole Begemann; 03.05.2010
comment
Блоки условной компиляции полезны, если вы хотите протестировать свое приложение в симуляторе iPhone 3.1 (поскольку симулятор 3.2 не поддерживает запуск универсального приложения в режиме iPhone). - person Ole Begemann; 03.05.2010
comment
Вы все еще можете объявить переменную типа 3.2, поскольку ваш базовый SDK - 3.2, просто не используйте его, если вы работаете на 3.1.3. Ваш код, который его использует, должен быть в условных операторах. - person progrmr; 03.05.2010
comment
Хорошо, думаю, мне следовало упомянуть, что я пытаюсь запустить это в симуляторе. :) То есть я на самом деле не могу тестировать универсальные приложения на симуляторе, а только на устройстве? Пожалуйста, убей меня сейчас. - person bpapa; 03.05.2010
comment
Вы можете протестировать универсальные приложения в симуляторе iPad и / или на реальном iPhone. Вы просто не можете протестировать их в симуляторе iPhone, по крайней мере, пока (если вы не можете скомпилировать его с помощью 3.1.3 Base SDK, от которого я отказался, слишком много # ifdef). - person progrmr; 03.05.2010
comment
Хорошо, на самом деле я был в высшей степени сбит с толку, даже когда я написал вопрос и отредактировал его заново. Проблема, с которой я действительно столкнулся, - когда я добавляю код, специфичный для 3.2, и переключаюсь на запуск приложения на симуляторе 3.1.3, он терпит неудачу. - person bpapa; 03.05.2010
comment
Как это не удается? Ошибки компиляции на 3.2 только фигня? Это потому, что вы компилируете с помощью 3.1.3 Base SDK, и у него нет этих определений. См. Мой предыдущий комментарий. Если вам действительно нужно протестировать на симуляторе iPhone, вы должны будете иметь возможность скомпилировать с базовым SDK 3.1.3, что означает, что # ifdef работает с любыми вещами 3.2, поскольку он не будет компилироваться там. - person progrmr; 03.05.2010
comment
Вы также можете сделать это: (1) Сборка для симулятора 3.2. (2) Переключите активный SDK на симулятор 3.1.3. (3) Запуск без перестройки. Это должно открыть приложение в симуляторе iPhone 3.1.3. Однако это хлопотно, потому что вам нужно переключаться между сборками. - person Ole Begemann; 03.05.2010
comment
Спасибо, чувак, я совершенно забыл об этом, и он мне нужен для универсального проекта, над которым я работаю. это так здорово иметь такие ответы вокруг SO. - person Adrian P; 12.02.2015

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

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

person progrmr    schedule 03.05.2010
comment
Будет здорово, если вы поделитесь с нами своим Utilities классом! :П :) ;) - person rptwsthi; 05.10.2013

Вот что мне подходит:

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

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

person Bob Withers    schedule 06.06.2010
comment
Стандартная установка SDK 3.2 удаляет SDK 3.1.x, поэтому вы не можете установить их в качестве активных SDK. - person Shaggy Frog; 30.07.2010