2010-01-29 10 views
13

Gibt es ein spezielles Xcode-Compiler-Flag, das beim Kompilieren für iPad gesetzt wird? bedingt kompilieren iPad vs iPhone/iPod Touch-Code zum BeispielGibt es ein spezielles Xcode-Compiler-Flag, das beim Kompilieren für das iPad gesetzt wird?

Ich möchte:

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

Ich weiß, es ist schon TARGET_OS_IPHONE und TARGET_CPU_ARM in TargetConditionals.h aber alles, was leicht und speziell iPad Ziele?

-rei

+0

ich habe gleiche Problem. Haben Sie eine andere Lösung für die gleiche Sache wie in Ihrer Frage .. Genau das gleiche möchte ich tun, aber zeigt mir Fehler "Symbol nicht gefunden" helfen Sie mir, dies zu tun .. – Ayaz

Antwort

16

Die richtige API für Laufzeitüberprüfung von iPad vs iPhone/iPad-touch zu verwenden ist:

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

der UIDevice Kopf Filer auch eine bequeme Makro enthält, UI_USER_INTERFACE_IDIOM(), die hilfreich sein, wenn Ihre Bereitstellung Ziel < ist iPhone 3.2 .

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

Also könnte man einfach sagen, negativ:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone); 
2

Statt Kompilierung-Flags zu verwenden, sollten Sie zur Laufzeit verwenden überprüfen z.B. Verwenden Sie NSClassFromString, um festzustellen, ob eine Klasse existiert, da dieselbe App auf beiden Geräten installiert werden kann.

Und wegen der Möglichkeit, die App in beiden Geräten auszuführen, gibt es keine integrierte Kompilierzeitprüfung, ob es iPad anvisiert oder nicht.

+1

Kenny ist korrekt. Apple empfiehlt die Laufzeitprüfung auf APIs und die schwache Verknüpfung mit neuen Frameworks usw. Sie können UIDevice Extensions von Erica Sadun (http://github.com/erica/uidevice-extension) verwenden, um auf einfache Weise zu überprüfen, auf welchem ​​Gerät Sie zur Laufzeit ausgeführt werden . Und wie Kenny sagt, sind NSClassFromString, responsesToSelector und Prüfe Funktionsnamen gegen NULL Ihre Freunde. – Jasarien

0

Derzeit habe ich nichts gefunden, mit dem Sie überprüfen können, ob Sie auf einem iPad sind, aber ich bin mir auch nicht sicher, ob Apple Laufzeitüberprüfungen empfiehlt. Hier ist ein Auszug aus Apple:

Zusätzlich zu Ihren View-Controller, alle Klassen, die zwischen iPhone und iPad-Geräten gemeinsam genutzt werden müssen bedingte Kompilierung Makros umfassen gerätespezifischen Code zu isolieren. Sie können zwar Laufzeitprüfungen verwenden, um festzustellen, ob bestimmte Klassen oder Methoden verfügbar sind. Durch das Hinzufügen von Codepfaden, die auf dem einen oder dem anderen Gerät nicht ausgeführt werden, erhöht sich die Größe der ausführbaren Datei. Wenn der Compiler diesen Code entfernt, wird der Code sauberer.

Allerdings gibt es keinen Ort, an dem ich genauere Informationen über bedingte Kompilierungsmakros finden könnte.

+0

Ja, ich habe das auch gelesen, also dachte ich, es würde irgendwo ein #define geben, aber ich konnte es nicht finden. Im Moment überprüfe ich, ob auf dem iPad mit den UIScreen-Dimensionen, aber das scheint nicht sehr elegant. Ich werde mir die oben erwähnte UIDevice-Erweiterung ansehen. Danke allen! -Rei – Rei

0

Für mehrere Ziele, die dasselbe Projekt/denselben Code verwenden, bearbeite ich die C-Flags für mein iPad-Ziel.

Mit dem [myapp] -iPad-Ziel, das als aktives Ziel ausgewählt wurde, wählen Sie Projekt -> Aktives Ziel bearbeiten [myapp] -iPad. Suchen Sie nach "c flags" und doppelklicken Sie darauf. Fügen Sie ein Flag für "-D TARGET_IPAD" hinzu. Jetzt wird das Symbol TARGET_IPAD nur für Ihr iPad-Ziel definiert.

Natürlich funktioniert das nur, wenn Sie separate Ziele für iPad und iPhone verwenden. Wenn Sie auf beiden die gleiche Binärdatei ausführen, kann der Compiler natürlich nichts für Sie tun. (Allerdings ist die 3.2 SDK ab Ende Januar nicht einmal unterstützen Universal-Apps noch.)

(Herausgegeben, ich war verwirrt über die Terminologie der „Universal“ apps etc.)

+0

Also sagst du, dass die mystische Universal-App, von der Apple spricht, noch nicht existieren kann? Interessanterweise, wenn wir zwei unterschiedliche Builds benötigen, sind dies zwei verschiedene Versionen, die an den App Store gesendet werden. Apple sagt, das ist nicht was sie wollen. Ich warte ab, wie sich das auswirkt. – Justin

+0

Die Versionshinweise für das 3.REDACTED SDK besagen, dass der Aufbau von UnivREDACTEDal Apps noch nicht unterstützt wird. Ich wette, es kommt bald. – qwzybug

-1

Ich denke, das

tun
-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
#endif 
    return NO; 
} 
+0

verwenden Sie einfach 'UI_USER_INTERFACE_IDIOM()' – user102008

0

Oder -> nur um sicher

-(BOOL)isDeviceAniPad 
{ 
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); 
return deviceIsPad; 
#endif 
return NO; 
} 
+0

verwenden Sie einfach 'UI_USER_INTERFACE_IDIOM()' – user102008

Verwandte Themen