Существует ли определенный флаг компилятора XCode, который установлен при компиляции для iPad?

Существует ли определенный флаг компилятора XCode, который установлен при компиляции для iPad?

Я хочу условно скомпилировать iPad по сравнению с кодом iPhone/iPod Touch, например:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

Я знаю, что уже существует TARGET_OS_IPHONE и TARGET_CPU_ARM в TargetConditionals.h, но что-нибудь, что легко и конкретно предназначается для iPad?

- Rei

13
задан Kristopher Johnson 2 February 2010 в 17:42
поделиться

6 ответов

Правильный API, который следует использовать для проверки iPad по сравнению с iPhone / iPad Touch во время выполнения:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

Файл заголовка UIDevice также включает удобный макрос UI_USER_INTERFACE_IDIOM (), который будет полезен, если ваша цель развертывания < iPhone 3.2.

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

Таким образом, вы могли бы просто сказать отрицательно:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
16
ответ дан 1 December 2019 в 23:47
поделиться

Вместо того, чтобы использовать флаги с компиляцией, вы должны использовать проверку выполнения E.g. Используйте NSClassFromString , чтобы увидеть, существует ли класс, потому что то же самое приложение может быть установлено на обоих устройствах.

И из-за возможности запуска приложения в обоих устройствах нет встроенного времени компиляции, проверьте ли он iPad или нет.

2
ответ дан 1 December 2019 в 23:47
поделиться
-

В настоящее время я не нашел ничего, что позволит вам проверить, есть ли вы на iPad, но я также не уверен, что Apple рекомендует проверки времени выполнения. Вот выдержка из Apple:

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

Однако нет места, я могу найти более конкретную информацию о условных макросах компиляции.

0
ответ дан 1 December 2019 в 23:47
поделиться

Как я только что узнал, это также может произойти в SQL 2005, если у вас не включен MARS. Я даже не знал, что он выключен по умолчанию, но это так. И убедитесь, что вы используете Тип подключения «NATIVE OLEDB\SQL Native Client». Если вы используете соединение типа «OLEDB.1» (или как...) MARS даже не является опцией, и вы получаете поведение SQL 2000, что противно.

Можно включить MARS, открыв свойства подключения, нажав кнопку «Все» и выполнив прокрутку в Management Studio.

Я знаю, что на ваш вопрос давным-давно был дан ответ, но я просто вбрасываю это для следующего сосунка, как я, который горит от этого.

-121--4587074-

Объявите указатели функций, добавьте их в структуру, а затем вызовите их, это просто C.

Пример:

//Typedef 2 function pointers, first takes and returns int,
// second takes and returns double
typedef int    (*FuncPtrInt)   (int);
typedef double (*FuncPtrDouble)(double);

// create structure to store function pointers
struct ABC
{
    FuncPtrInt    applyA;
    FuncPtrDouble applyB;
};

// create some functions to use with structure
int incrFuncA(int num) { return ++num; }
double decrFuncB(double num) { return --num; }
double multiplyFuncB(double num) { return num*num; }

// try it out
void testStruct()
{
    struct ABC abc;
    abc.applyA = incrFuncA;
    abc.applyB = decrFuncB;

    NSLog(@"increment: %d",abc.applyA(3));
    NSLog(@"decrement: %f",abc.applyB(3.5));

    abc.applyB = multiplyFuncB;

    NSLog(@"multiply: %f",abc.applyB(3.5));
}

Output:

2010-02-01 10:36:22.335 x[11847] increment: 4
2010-02-01 10:36:22.336 x[11847] decrement: 2.500000
2010-02-01 10:36:22.336 x[11847] multiply: 12.250000

Если требуется иметь структуру с функциями, в которой функции работают со структурой, необходимо передать указатель на эту функцию по умолчанию (аналогично тому, что делает c++):

Определите:

struct ClassABC;
typedef int (*FuncPtrClassABC)(struct ClassABC *);
typedef int (*FuncPtrClassABCInt)(struct ClassABC *, int);

int incrFunc(struct ClassABC * abc);
int decrFunc(struct ClassABC * abc);
int addFunc(struct ClassABC * abc, int num);
int subtractFunc(struct ClassABC * abc, int num);

struct ClassABC
{
    int i;
    FuncPtrClassABC    increment;
    FuncPtrClassABC    decrement;
    FuncPtrClassABCInt add;
    FuncPtrClassABCInt subtract;
};

Поскольку эти функции могут быть автономными, следует передать ClassABC в:

int incrFunc(struct ClassABC * abc) { return ++(abc->i); }
int decrFunc(struct ClassABC * abc) { return --(abc->i); }
int addFunc(struct ClassABC * abc, int num)
{ abc->i += num; return abc->i; }
int subtractFunc(struct ClassABC * abc, int num)
{ abc->i -= num; return abc->i; }

func помощника по инициализации:

void initClassABC(struct ClassABC * abc)
{
    abc->i = 0;
    abc->increment = incrFunc;
    abc->decrement = decrFunc;
    abc->add = addFunc;
    abc->subtract = subtractFunc;
}

Использование:

struct ClassABC cabc;
initClassABC(&cabc);

cabc.add(&cabc,4);
NSLog(@"add: %d", cabc.i);

cabc.decrement(&cabc);
NSLog(@"decrement: %d", cabc.i);

cabc.subtract(&cabc,2);
NSLog(@"subtract: %d", cabc.i);

Вывод:

2010-02-01 10:56:39.569 x[12894] add: 4
2010-02-01 10:56:39.569 x[12894] decrement: 3
2010-02-01 10:56:39.569 x[12894] subtract: 1

Наслаждайтесь

-121--1466613-

Для нескольких целей, совместно использующих один и тот же проект/код, я делаю это, редактируя флаги C для моей цели iPad.

Выбрав в качестве активного целевого объекта [myapp] -iPad, выберите Project - > Edit Active Target [myapp] -iPad. Найдите «c flags» и дважды щелкните мышью. Добавьте флаг для «-D» TARGET_IPAD. Теперь TARGET_IPAD символов будет определяться только для цели iPad.

Конечно, это работает, только если вы используете отдельные мишени для iPad и iPhone. Если вы используете один и тот же двоичный файл на обоих, очевидно, что компилятор ничего не может сделать для вас. (Однако SDK 3.2 на конец января еще не поддерживает приложения Universal.)

(отредактировано; Меня смутила терминология «универсальных» приложений и т.д.)

0
ответ дан 1 December 2019 в 23:47
поделиться

Думаю, это подойдет

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
-1
ответ дан 1 December 2019 в 23:47
поделиться

Или -> на всякий случай

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}
0
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: