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];