2012-08-08 11 views
6

Tengo un archivo Constants.h que contiene algunas constantes globales de hecho. Como mi aplicación está diseñada tanto para iPhone como para iPad, me gustaría definir las mismas constantes (es decir, con el mismo nombre) de manera diferente para los dos tipos de dispositivos.Definir constante según el tipo de dispositivo

Para una explicación completa:

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

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

¿Cómo puedo hacer esto? Gracias.

L.

Respuesta

18

Es imposible conseguir el tipo de dispositivo en la decodificación previa paso. Se determina dinámicamente durante el tiempo de ejecución. Tiene dos opciones:

  1. Cree dos objetivos diferentes (para iPhone y iPad respectivamente) y defina macro allí.

  2. Crear macro que inserta la expresión de la siguiente manera:

#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

Creo que probaré con la segunda opción y si funciona correctamente Marcaré su respuesta como correcta :) – Lolloz89

+0

excelente foto gracias –

+0

wow nice answer – Spynet

0

Hola escribir este código en appdelegate clase

+(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; 
} 

llamada esto de su clase utilizando esta línea

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

Esto no es una clase, es un archivo de cabecera, por lo tanto, nunca se inicializa una i no puede llamar a los métodos de allí .. – Lolloz89

2

#define se resuelven en tiempo de compilación, es decir en su ordenador

Obviamente, no puede hacerlos co nditional de la manera que desee. Recomiendo crear la variable static y configurarlas en el método +(void)initialise de su clase.

Y para la condición, usar algo como

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

Así que iría

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

Esto no es una clase, es un archivo de encabezado, por lo tanto, nunca se inicializa .. – Lolloz89

+0

Úselo en su clase AppDelegate, de esa manera estará accesible en toda la aplicación – Olotiar

0

Uso UIDevice Macros - http://d3signerd.com/tag/uidevice/

A continuación, puede escribir código como;

if ([DEVICE_TYPE isEqualToString:DEVICE_IPAD]) { 

} 

o

if (IS_SIMULATOR && IS_RETINA) { 

} 
0

No se puede hacer esto con define, a medida que se expanden en tiempo de compilación. Sin embargo, se pueden definir las variables y establecer su valor inicial basado en el lenguaje de interfaz de usuario:

// SomeClass.h 
extern CGFloat deviceDependentSize; 

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


    // etc. 
} 
Cuestiones relacionadas