Универсальное приложение для iPhone / iPad - PullRequest
9 голосов
/ 02 октября 2010

Мне было интересно, сможет ли кто-нибудь сказать мне, запуская новое приложение с нуля, как мне организовать универсальное (iPhone / iPad) приложение для iOS.Я заметил, что использование шаблона по умолчанию с бета-версией xCode дает вам как общий AppDelegate, так и подклассифицированный appdelegate для iPhone и iPad.

Теперь, как вы вводите логику, чтобы определить, какой делегат приложения использовать, как он знает, какой экземпляр создать и работать с ним, как шаблон по умолчанию, не устанавливает.Если бы я написал в приложении iPhone Delegate, откуда мне знать, что это будет работать только для iPhone iOS, например?

Ответы [ 5 ]

13 голосов
/ 02 октября 2010

Info.plist («Основное имя файла основного пера») для приложения указывает файл .xib главного окна для загрузки, а этот файл .xib указывает делегата приложения и контроллер корневого окна для приложения.

Info.plist для iPad («NSMainNibFile ~ ipad») дополнительно определяет XIB-файл главного окна для iPad, который может содержать другой делегат приложения и другой контроллер корневого окна для приложения.Или они могут быть одинаковыми, используя проверки времени выполнения UIUserInterfaceIdiomPad.

Среда выполнения, которая знает, на каком типе устройства она работает, выбирает правильный исходный файл .xib для загрузки из info.plist и оттудавы получаете правильный делегат приложения и контроллер корневого окна, настроенный и работающий.

9 голосов
/ 02 октября 2010

Используйте следующий код

id<UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate]; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    AppDelegate_iPad *appDelegate = (AppDelegate_iPad *) delegate;
else
    AppDelegate_iPhone *appDelegate = (AppDelegate_iPhone *) delegate;

всякий раз, когда вам требуется доступ к делегату.

2 голосов
/ 26 ноября 2011

Вариации на тему

Создать файл Common.h

// Global Helpers
#define APP_DELEGATE()  (AppDelegate *)[[UIApplication sharedApplication] delegate]
#define APP_DELEGATE_IPAD()  (AppDelegate_iPad*) [[UIApplication sharedApplication] delegate]; 
#define APP_DELEGATE_IPHONE()  (AppDelegate_iPhone*) [[UIApplication sharedApplication] delegate]; 
#define IS_IPAD ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)

Импортируйте этот Common.h / AppDelegate_iPhone.h / AppDelegate_iPad.h /AppDelegate.h в ваш предварительно скомпилированный заголовочный файл .pch

тогда в вашем классе вы можете просто позвонить

if (IS_IPAD) {
      AppDelegate_iPad *appDelegate = APP_DELEGATE_IPAD();
}else{
    AppDelegate_iPhone *appDelegate = APP_DELEGATE_IPHONE();
}
1 голос
/ 15 февраля 2012

Продолжая ответ Сагара, вот код, который исправит комментарий Райана Ваггонера.

id<UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate]; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    delegate = (AppDelegate_iPad *) delegate;
else
    delegate = (AppDelegate_iPhone *) delegate;

Проблема с предыдущим ответом состоит в том, что он фактически не дает доступа к переменной delegate внеЕсли заявление.Этот код просто приводит исходную переменную к нужному типу.

1 голос
/ 02 октября 2010

Я делаю то же самое в данный момент, и я многому научился из следующего урока:

http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html

Это помогло мне настроить проект для поддержки устройств iPad и iPhone.

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