Разные перья для разных устройств - PullRequest
3 голосов
/ 08 апреля 2011

Итак, я пишу приложение и хочу, чтобы оно было универсальным. Когда я создал проект, я создал универсальное приложение. Я написал весь код iPhone и у меня около 10 классов. Теперь я хочу создать версию для iPad. Вместо того, чтобы иметь два набора классов с практически одинаковым кодом, я бы хотел загрузить другой Nib в зависимости от типа устройства.

Я попытался использовать BOOL в делегате приложения, и у меня возникли проблемы с этим. Я попытался проверить устройство в классе mainViewController (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil Я вернул другое перо в зависимости от типа устройства. Но я мог получить только версию для iphone или пустой кончик. Заранее спасибо за любую помощь.

Ответы [ 4 ]

6 голосов
/ 08 апреля 2011

В соответствии с документацией (Руководство по программированию ресурсов) вы можете использовать соглашение об именах, например: myNibName ~ ipad.xib и myNibName ~ iphone.xib, поэтому каждый файл будет открыт только на поддерживаемом устройстве.Вам даже не нужно устанавливать разные appDelegates:)

--- из doc --- В iOS 4.0 и более поздних версиях можно пометить отдельные файлы ресурсов как пригодные для использования только на устройстве определенного типа.Эта возможность упрощает код, который вы должны написать для универсальных приложений.Вместо того, чтобы создавать отдельные пути кода для загрузки одной версии файла ресурсов для iPhone и другой версии файла для iPad, вы можете позволить подпрограммам загрузки пакетов выбрать правильный файл.Все, что вам нужно сделать, это правильно присвоить имена файлам ресурсов.

Чтобы связать файл ресурсов с определенным устройством, вы добавляете в его имя пользовательскую строку модификатора.Включение этой строки модификатора приводит к именам файлов в следующем формате:

.

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

~ ipad - ресурс должен быть загружен только на устройствах iPad.~ iphone - ресурс должен загружаться только на устройствах iPhone или iPod touch.

1 голос
/ 08 апреля 2011

Apple теперь предоставляет вам механизм по умолчанию для разделения вашего кода между iPhone и iPad в одном проекте.

В Xcode 4, когда вы создаете новое «оконное приложение» или «View-Приложение », вам предоставляется возможность выбрать« Семейство устройств ».Если вы выберете «Универсальный» для этой опции, Xcode создаст 3 делегата приложения.

Сначала, делегат основного приложения:

YourAppNameAppDelegate : NSObject <UIApplicationDelegate> 

и два других делегата приложения (помещенные в отдельные группы)которые являются подклассами «YourAppNameAppDelegate»:

YourAppNameAppDelegate_iPhone : YourAppNameAppDelegate
YourAppNameAppDelegate_iPad : YourAppNameAppDelegate

Когда вы запускаете свое приложение с помощью имитатора (или устройства) iPhone или iPad, приложение автоматически использует подкласс делегата приложения _iPhone или _iPad на основевыбранное устройство.

Если вы переопределите application: didFinishLaunchingWithOptions: метод в каждом подклассе, вы увидите, что это работает:

// In YourAppNameAppDelegate_iPhone.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"iPhone App Delegate");
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

// In YourAppNameAppDelegate_iPad.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"iPad App Delegate");
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

Это дает вам отправную точку, где вы можете изменять поток программы на основеустройство, на котором находится пользователь.Например, создав экземпляр одного из подклассов вашего основного контроллера представления (как описано ниже).

По мере добавления новых контроллеров представления в ваш проект, вы должны продолжить эту парадигму, создав один универсальный суперкласс контроллера иiPhone / iPad специфический подкласс.Обратите внимание, что универсальные суперклассы не должны иметь связанные с ними nib-файлы, в то время как каждый из подклассов должен иметь свой собственный отдельный nib.

Таким образом, вы можете разбить код между тремя классами, сохраняя независимость от платформы.суперкласс - например, некоторые свойства, методы, IBOutlets и IBActions - и помещают специфичные для платформы реализации в любой подкласс.

0 голосов
/ 11 апреля 2011

Я понял, как:

в Интерфейсном Разработчике, используйте Файл-> Создать версию для iPad

затем сохраните файл и добавьте его в проект. Затем при выделении инициализируйте каждый viewController, проверьте, если UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad, а в противном случае это iPhone или iPod Touch. У меня были проблемы с внесением изменений в него после первоначального сохранения, но оно работает.

0 голосов
/ 08 апреля 2011

У меня была эта проблема, и я решил ее, настроив метод initWithNibName:bundle: UIViewController.

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
  // See below for definition of "LWEUniversalAppHelpers fileNamed:"
  NSString *universalNibName = [LWEUniversalAppHelpers fileNamed:nibNameOrNil];
  if ((self = [super initWithNibName:universalNibName bundle:nibBundleOrNil]))
  {
    // Custom initialization
  }
  return self;
}

LWEUniversalAppHelpers - это класс помощников, который моя компания написала, чтобы определить, является ли устройство iPad или нет. Это публично на GitHub , но основная концепция заключается в том, чтобы использовать политику «@ 2x» Retina, но вместо этого мы используем «@HD».

...