API, чтобы определить, работает ли на iPhone или iPad

Есть ли API для проверки во время выполнения, работаете ли вы на iPhone или iPad?

Один из способов, который я могу придумать, – использовать:

[[UIDevice currentDevice] model]; 

И обнаружите существование строки @ «iPad» – которая кажется немного хрупкой.

В SDK 3.2 я вижу, что UIDevice также имеет свойство, которое действительно то, что я ищу, но не работает для pre-3.2 (очевидно):

 [[UIDevice currentDevice] userInterfaceIdiom]; 

Существуют ли другие способы, кроме проверки наличия «iPad» для универсального приложения?

Оформить заказ UI_USER_INTERFACE_IDIOM .

Возвращает идиому интерфейса, поддерживаемую текущим устройством.

Возвращаемое значение
UIUserInterfaceIdiomPhone если устройство является iPhone или iPod touch или UIUserInterfaceIdiomPad если устройство является iPad.

UIUserInterfaceIdiom

Тип интерфейса, который должен использоваться на текущем устройстве

 typedef enum { UIUserInterfaceIdiomPhone, UIUserInterfaceIdiomPad, } UIUserInterfaceIdiom; 

Только для моей справки:

 @property (nonatomic, readonly) BOOL isPhone; -(BOOL)isPhone { return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone); } 

или используйте #define

 #define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone) 

Однако, если вы используете isPhone всему вашему коду, это, как правило, плохая практика. Используйте шаблон фабрики и polymorphism, чтобы содержать ваши утверждения if , поэтому вы получаете объекты, созданные для телефона или iPad, а затем работаете с ними.

добавленной

Теперь я использую это решение по всему моему коду. Он добавляет стандартный шаблон фабрики в alloc.

 #define ALLOC_PER_DEVICE() id retVal = nil; \ NSString *className = NSStringFromClass(self);\ if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\ className = [NSString stringWithFormat:@"%@Phone", className];\ Class newClass = NSClassFromString(className);\ retVal = [newClass alloc];\ }\ if (!retVal)\ retVal = [super alloc];\ assert(retVal != nil);\ return retVal\ 

Тогда мои выделения выглядят так:

 +alloc { ALLOC_PER_DEVICE(); } 

И я добавляю подclass под названием TheClassPhone для версии телефона.

Примечание. Поскольку в Objective-C нет множественного наследования, использование наследования для решения ваших проблем немного завышено (т. Е. Оно не работает, если у вас есть подclassы подclassов). Ничего хорошего, if вам это нужно.

  1. Проверьте наличие свойства userInterfaceIdiom, ответы отвечаютToSelector :. Если он не существует, мы находимся на устройстве с предустановкой 3.2, а не iPad.
  2. Если userInterfaceIdiom существует, используйте его.

Изменить: … что явно соответствует макросу UI_USER_INTERFACE_IDIOM (), поэтому используйте его. 🙂

Вы можете проверить, запускаете ли приложение приложение на iPhone или iPad, используя следующий код:

 - (NSString *)deviceModel { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } - (NSString *) platformString { NSString *platform = [self deviceModel]; if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G"; else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G"; else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS"; else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4"; else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4"; else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S"; else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5"; else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5"; else if ([platform isEqualToString:@"iPod1,1"]) return @"iPod_Touch 1G"; else if ([platform isEqualToString:@"iPod2,1"]) return @"iPod_Touch 2G"; else if ([platform isEqualToString:@"iPod3,1"]) return @"iPod_Touch 3G"; else if ([platform isEqualToString:@"iPod4,1"]) return @"iPod_Touch 4G"; else if ([platform isEqualToString:@"iPad1,1"]) return @"iPad_1G"; else if ([platform isEqualToString:@"iPad2,1"]) return @"iPad_2(WiFi)"; else if ([platform isEqualToString:@"iPad2,2"]) return @"iPad_2(GSM)"; else if ([platform isEqualToString:@"iPad2,3"]) return @"iPad_2(CDMA)"; else if ([platform isEqualToString:@"iPad3,1"]) return @"iPad_3"; else if ([platform isEqualToString:@"iPad3,2"]) return @"iPad_3(GSM/CDMA)"; else if ([platform isEqualToString:@"iPad3,3"]) return @"iPad_3(GSM)"; else if ([platform isEqualToString:@"iPad3,4"]) return @"iPad_3(GSM)"; else if ([platform isEqualToString:@"iPad2,5"]) return @"iPad_mini_1G"; else if ([platform isEqualToString:@"i386"]) return @"Simulator"; else if ([platform isEqualToString:@"x86_64"]) return @"Simulator"; return platform; } 

Используйте NSClassFromString и class, предназначенный для iPad. Подробнее здесь:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html#//apple_ref/doc/uid/TP40009370-CH9-SW3

  • Удалить HTML-tags из NSString на iPhone
  • Когда вы делаете подчеркивание перед переменной экземпляра?
  • Опубликовать фотографию на стене пользователя, используя Facebook iOS SDK
  • Изучение основ UIScrollView
  • Как я могу перебирать все подпункты UIView, а также их подзоны и их подпрограммы
  • Как проверить локальный Wi-Fi (не только сотовую связь) с помощью iPhone SDK?
  • Как включить и использовать новые шрифты в iPhone SDK?
  • Возможно открытие всплывающих ссылок в UIWebView?
  • Создать случайное число в пределах диапазона?
  • Пользовательский интерфейс UINavigationBar
  • Нажмите ViewController справа налево с помощью UINavigationController
  • Interesting Posts

    матричная транспозиция в clojure

    Как вы получаете общий объем оперативной памяти компьютера?

    Recyclerview Изменение элементов во время прокрутки

    Как пропустить проверку при нажатии на определенную кнопку?

    Задержка / синхронизация RAM влияет на совместимость материнской платы?

    Меню загрузки Windows не отображается при загрузке

    Захват и stdout и stderr в Bash

    Могу ли я перенести установку Ubuntu vmware на новый ноутбук?

    angular2: Ошибка: TypeError: невозможно прочитать свойство «…» неопределенного

    Динамически размер uitableViewCell в соответствии с UILabel (с интервалом между абзацами)

    Официальные ссылки на значения по умолчанию для одновременных соединений HTTP / 1.1 на сервер?

    Как правильно использовать обратную совместимость вектора вектора с последней поддержкой Android?

    Как повторить fragment HTML несколько раз без ngFor и без другого @Component

    Согласование структуры агрегации mongodb по вложенным документам

    Google Chrome отображает сохраненные данные формы

    Давайте будем гением компьютера.