Я работаю над новым приложением, что я хочу быть универсальным для iPhone и iPad. Я начал с, "Создают приложение Оконное" мастер, и он создал делегатов отдельного приложения в группах "iPhone" и "iPad". Так как я уже был довольно знаком с iPhone dev, я внес свой вклад своего проекта, и теперь я готов сделать некоторый материал iPad.
Так... Я начал путем добавления UISplitViewController к моему делегату iPad, переключите Активный SDK на 3,2, и он работает! Но когда я переключаюсь назад на 3.1.3 и пытаюсь выполнить его в средстве моделирования, Сборке и Пойти сбои. Для начала, я вижу:
... путь.../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; версия доктора вопроса - я пропускал установку где-нибудь?
Как раз наоборот. Универсальное приложение запускает один и тот же двоичный файл на 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];
Подобные вещи могут упростить кодирование и упростить использование условных обозначений. Тем не менее, все равно придется протестировать все дважды.
Вот что у меня работает:
Бинарный файл, собранный под 3.2, будет установлен в симуляторе 3.x без перекомпоновки. Когда вы закончите, не забудьте вернуть активный SDK к 3.2.