Посмотрите на ваш файл main.c
, он должен содержать следующее утверждение:
int retVal = UIApplicationMain(argc, argv, nil, nil);
, где UIApplicationMain
определяется как:
int UIApplicationMain (
int argc,
char *argv[],
NSString *principalClassName,
NSString *delegateClassName
);
Итак, вы просто выполняете:
int retVal = UIApplicationMain(argc, argv, nil, <YOUR_DELEGATE_CLASS_NAME>);
и ваша программа будет использовать этот класс делегата вместо того, который определен в наконечнике.
Также рассмотрите возможность редактирования файла info.plist, в котором вы должны удалить все записи об основных файлах nib, которые вы там найдете, иначе ваша программа вылетит, если вы удалите файлы xib из проекта.
РЕДАКТИРОВАТЬ: Я поздно понял, что вы также спрашиваете о том, как отличить iPad от iPhone ... и надеется, что это не требует проверки, если UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
.
AFAIK, UI_USER_INTERFACE_IDIOM
это официальный способ сделать это. Действительно, если вы проверите определение этого макроса, вы увидите, что он основан на классе UIDevice
, который возвращает информацию об устройстве, на котором работает ваша программа. Так что я не вижу в этом ничего плохого.
Альтернативным подходом может быть использование самого UIDevice
или UIDevice-Extension , являющегося платформой, расширяющей UIDevice
.
РЕДАКТИРОВАТЬ 2:
На вопросы, которые вы задаете в комментариях:
1) Если есть .xibs, мне не нужно указывать UI_USER_INTERFACE_IDIOM
(согласно сообщению Котана, связанному выше). Должен ли я выбирать между перьями и
это if
заявление?
Я так думаю; либо вы делаете это на уровне xib, либо программно.
2) Вы предлагаете добавить оператор if
для отслеживания устройства в
main.m
? Это правда, это работает там. Обратите внимание на изменение в XCode 4.2:
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
Если вы делаете это программно, вы должны делать это там, где вам нужно.
Вероятно, делегат приложения является частью приложения, которая не зависит от устройства, поэтому вам не нужно строго создавать экземпляр для iphone и другой для ipad. Я указывал на то, что если вы не предоставляете перо, вы должны указать делегата, который просто определяет для вашего приложения точку входа высокого уровня.
В вашем – application:didFinishLaunchingWithOptions:
(точке входа в приложение) вы должны затем создать свой пользовательский интерфейс, то есть создать тот набор объектов, который вы бы иначе определяли в кончике (контроллеры, представления, что угодно; перо это просто механизм для визуально «создавать» и соединять объекты; если вы не делаете это визуально, вы делаете это программно) и соединяете их; теперь некоторые из этих объектов зависят от устройства (то есть, представления), другие нет. Для первых вы можете решить, от какого класса создавать их экземпляры, используя проверку UI_USER_INTERFACE_IDIOM
.
В качестве альтернативы вы можете использовать два разных класса делегатов: один создает интерфейс iphone, а другой - интерфейс ipad; это также совершенно разумный подход. Это в основном зависит от сложности вашего приложения и компромиссов, которые вы готовы принять.
Это более или менее то, как я вижу вещи, извинения за то, что я, возможно, педантичен, но я надеюсь, что смогу прояснить это.
Если у вас много if
вокруг вашего приложения, вы также можете определить функцию «декоратор» (например: decoratedClassNameFromGenericClassName:(NSString*)
, не обращая внимания на многословие), чтобы скрыть в нем UI_USER_INTERFACE_IDIOM
или любую другую «декорацию», необходимую может возникнуть в будущем ...