2012-08-08 8 views
6

Ich habe eine Constants.h-Datei, die tatsächlich einige globale Konstanten enthält. Da meine Anwendung sowohl für iPhone als auch für iPad erstellt wird, möchte ich dieselben Konstanten (dh mit demselben Namen) für die beiden Gerätetypen unterschiedlich definieren.Definiere Konstante basierend auf dem Gerätetyp

Eine vollständige Erklärung:

/******** pseudo code *********/ 

if (deviceIsIPad){ 
    #define kPageMargin 20 
} 
else { 
    #define kPageMargin 10 
} 

Wie kann ich das tun? Danke.

L.

Antwort

18

Es ist unmöglich, während der Gerätetyp zu bekommen Schritt So gehen Vorverarbeitung. Es wird zur Laufzeit dynamisch ermittelt. Sie haben zwei Möglichkeiten:

  1. Erstellen Sie zwei verschiedene Ziele (für iPhone und iPad respectively) und definieren dort Makro.

  2. Makro erstellen, die Ausdruck wie diese Einsätze:

#define IS_IPAD (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) 

#define kMyConstant1 (IS_IPAD ? 100 : 200) 
#define kMyConstant2 (IS_IPAD ? 210 : 230) 
#define kMyConstant3 (IS_IPAD ? @"ADASD" : @"XCBX") 
+0

Ich denke, ich werde die zweite Option versuchen und wenn es richtig funktioniert, werde ich Ihre Antwort als richtig markieren :) – Lolloz89

+0

great shot thanks –

+0

wow nette Antwort – Spynet

0

Hallo schreiben diesen Code in appdelegate Klasse

+(NSString *)isAppRunningOnIpad:(NSString *)strNib{ 
    NSString *strTemp; 
    NSString *deviceType = [UIDevice currentDevice].model; 
    if ([deviceType hasPrefix:@"iPad"]){ 
     strTemp=[NSString stringWithFormat:@"%@I",strNib]; 
    } 
    else{ 
     strTemp=strNib; 
    } 
    return strTemp; 
} 

nennen dies aus Ihrer Klasse mit dieser Linie

SecondVC *obj_secondvc = [[SecondVC alloc] initWithNibName:[AppDelegate isAppRunningOnIpad:@"SecondVC"] bundle:nil]; 
+0

Dies ist nicht eine Klasse, es ist eine Header-Datei, daher wird es nie ein initialisiert ich nicht Methoden aufrufen kann von dort aus .. – Lolloz89

2

#define werden bei der Kompilierung, dh auf Ihrem Computer behoben

Offensichtlich können Sie sie nicht zusammen machen Natürlich wie Sie wollen. Ich empfehle, static Variablen zu erstellen und sie auf die +(void)initialise Methode Ihrer Klasse einzustellen.

Und für den Zustand, verwenden Sie so etwas wie

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // iPad 
} else { 
    // iPhone or iPod touch. 
} 

das würde

static NSInteger foo; 

@implementation bar 

+(void)initialise{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     // iPad 
     foo = 42; 
    } else { 
     // iPhone or iPod touch. 
     foo = 1337; 
    } 
} 

@end 
+0

Dies ist keine Klasse, es ist eine Header-Datei, daher wird sie niemals initialisiert. – Lolloz89

+0

Verwenden Sie es auf Ihrer AppDelegate-Klasse, auf diese Weise wird es in der ganzen App zugänglich sein – Olotiar

0

Verwenden UIDevice Makros - http://d3signerd.com/tag/uidevice/

Dann sind Sie wie Code schreiben können;

if ([DEVICE_TYPE isEqualToString:DEVICE_IPAD]) { 

} 

oder

if (IS_SIMULATOR && IS_RETINA) { 

} 
0

Sie können dies nicht mit definiert, wie sie bei der Kompilierung erweitert sind. Allerdings können Sie Variablen definieren und deren Anfangswert basierend auf der Benutzeroberfläche Idiom:

// SomeClass.h 
extern CGFloat deviceDependentSize; 

// SomeClass.m 
- (id)init 
{ 
    // ... 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad]) 
     deviceDependentSize = 1024.0f; // iPad 
    else 
     deviceDependentSize = 480.0f; // iPhone 


    // etc. 
}