IOS: Использование модификаторов устройств для загрузки xib файлов?
Вы можете использовать модификатор устройства (например, ~ ipad) для предоставления определенного в устройстве ключа в Info.plist и указать образ запуска для устройства (Default.png для iPhone и Default ~ ipad.png для iPad, например). Эти две вещи специально упоминаются в Apple Docs, но они не говорят, что это будет работать для любых других типов файлов.
Я обнаружил (совершенно случайно), что это работает для загрузки файлов .xib через initWithNibName:bundle:
. Так, например, я могу иметь MyView.xib и MyView ~ ipad.xib, и этот код:
MyViewController *viewController = [[MyViewController alloc]
initWithNibName:@"MyView" bundle:nil];
... полностью загрузит MyView ~ ipad.xib на iPad и MyView.xib на другие устройства.
Итак, 1) Является ли это документированным где-то? Я не мог найти ни одного документа Apple. Это надежное средство, чем проверка UI_USER_INTERFACE_IDIOM() и жесткого кодирования двух разных имен нитей во всем мире, но я не доверяю ему, если он не документирован.
И, 2) Кто-нибудь знает, какая версия iOS начала работать? Я только пробовал это в 4.2, и он работает там. Модификаторы устройств в целом (даже для документированных вещей, перечисленных выше) составляют минимум 4.0.
Ответы
Ответ 1
Собственно, он явно определен в документах, но как сноска.
CocoaNibs
В примечании внизу "Загрузка файлов NIB с использованием NSBundle":
Примечание. Если вы разрабатываете Универсальное приложение для iOS, вы можете использовать обозначение устройства соглашения о загрузке правильного наконечника файл для базового устройства автоматически. Чтобы получить больше информации о том, как назвать ваши файлы nib, см. "iOS поддерживает специфику устройства Ресурсы".
Какая ссылка на Cocoa Концептуальные загрузочные ресурсы
Однако, да, это функция 4.0+.
Ответ 2
У меня была такая же проблема. Сначала ответ не имел смысла, но хорошей новостью является то, что это легко сделать!:)
Просто назовите свои iPad xibs без каких-либо модификаторов и ваших iPhone xibs с модификатором ~ iphone, и он правильно их выберет.
Итак, с MyViewController у вас будет MyViewController.xib
для iPad и MyViewController~iphone.xib
для iPhone. Затем вы можете просто запустить свой контроллер просмотра с помощью простого alloc/init.
[[MyViewController alloc] init]
, и он захватит правый xib.
Итак, когда я создаю новый контроллер представления в XCode, я всегда выбираю поле для его форматирования для ipad, потому что создаваемый xib будет называться MyViewController.xib, и вы хотите, чтобы это был размер xib для iPad. Затем я создаю второй xib, отформатированный для iPhone и назову его с помощью модификатора ~ iphone.
Документация иногда немного противоречива, но на этой странице рассказывается о том, как ресурсы с идентификатором будут по умолчанию использоваться для iPad.
ImageSoundResources
Проверьте раздел об использовании изображений с высоким разрешением. Я знаю, что мы говорим о xibs, а не о изображениях, но это работает. Мои последние 6 приложений использовали эту идиому.
Ответ 3
Ненавижу быть этим парнем и отвечать на свой вопрос, но я думаю, что ответ:
1) Нет, не указано явно в любой документации Apple, и
2) 4.0 и выше (это основано на моем собственном тестировании)
Все, что вы действительно сохраняете, это пара строк проверки кода для UI_USER_INTERACE_IDIOM(). Тем не менее, я возьму его. Меньше кода меньше кода.
Ответ 4
Соответствующий метод для использования в iOS 3.2 и более поздних версиях - это функция UI_USER_INTERFACE_IDIOM()
. Обычно я использую тернарный оператор для инициализации UIViewController
с помощью соответствующего XIB.
UIViewController* controller = [[UIViewController alloc]
initWithNibName:UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ?
@"YourViewController-iPad" : @"YourViewController" andBundle:nil];