1

Je travaille sur une application universelle qui devrait être en mesure de fonctionner sur iPad et iPhone. Les docs iPad d'Apple disent utiliser UI_USER_INTERFACE_IDIOM() pour vérifier si je suis en cours d'exécution sur iPad ou iPhone, mais notre iPhone est 3.1.2 et ne sont UI_USER_INTERFACE_IDIOM() définis. En tant que tel, ce code casse:Vérifier si UI_USER_INTERFACE_IDIOM existe à l'exécution

//iPhone should not be flipped upside down. iPad can have any 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    return YES; //are we on an iPad? 
} else { 
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
} 
} 

Dans SDK Compatibility Guide d'Apple, ils suggèrent de faire ce qui suit pour vérifier si la fonction existe:

//iPhone should not be flipped upside down. iPad can have any 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
if(UI_USER_INTERFACE_IDIOM() != NULL && 
    UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    return YES; //are we on an iPad? 
} else { 
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
} 
} 

Cela fonctionne, mais les résultats dans l'avertissement du compilateur: « Comparaison entre pointeur et entier. " Après avoir creusé autour je me suis dit que je peux faire disparaître le avec l'association suivante (void *) avertissement du compilateur:

//iPhone should not be flipped upside down. iPad can have any 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
if((void *)UI_USER_INTERFACE_IDIOM() != NULL && 
    UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    return YES; //are we on an iPad? 
} else { 
    return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
} 
} 

Ma question est la suivante: Est-ce le dernier bloc de code ici pratique correct/acceptable/standard? Je ne pouvais pas trouver quelqu'un d'autre à faire quelque chose comme ça avec une recherche rapide qui me fait me demander si j'ai raté un getcha ou quelque chose de similaire.

Merci.

+0

'UI_USER_INTERFACE_IDIOM' est une macro compilation. Il ne "existe" pas à l'exécution – user102008

+0

Cela ne rend pas cette question digne de caution. –

Répondre

6

Vous devez créer des applications pour iPad contre le SDK 3.2. En tant que tel, il sera construit correctement, et la macro UI_USER_INTERFACE_IDIOM() fonctionnera toujours. Si vous voulez savoir comment/pourquoi chercher dans la documentation - c'est un #define, qui sera compris par le compilateur et compiler en code qui fonctionnera correctement sur 3.1 (etc).

+0

D'accord, ouais, ça a marché. J'ai compris ce qui s'était passé: au départ, je mettais en place le projet pour créer deux applications différentes, puis je passais à l'utilisation d'une application universelle. Le code dans le premier bloc était pour l'ancienne et je ne l'ai apparemment jamais utilisé lors de la construction contre 3.2. Merci pour l'aide! – MrHen