2012-08-08 132 views
6

我有一个Constants.h文件,其中实际上包含一些全局常量。由于我的应用程序是为iPhone和iPad构建的,因此我想为两种设备类型定义相同的常量(即具有相同的名称)。根据设备类型定义常量

有关完整的说明:

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

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

我怎样才能做到这一点? 谢谢。

L.

回答

18

前工序中得到设备类型这是不可能的。它是在运行时动态确定的。你有两种选择:

  1. 创建两个不同的目标(分别为iPhone和iPad)并在那里定义宏。

  2. 创建宏插入这样的表达:

#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

我想我会尝试第二个选项,如果它工作正常我会标记你的答案是正确的:) – Lolloz89 2012-08-08 10:05:40

+0

伟大的拍摄感谢 – 2012-08-29 10:13:16

+0

哇好的答案 – Spynet 2013-03-28 11:52:57

0

喜用这条线

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

这不是一类,它是一个头文件,因此它永远不会初始化的我不能把从那里方法.. – Lolloz89 2012-08-08 10:03:29

2

#define写代码appdelegate

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

调用该从你的类在编译时您的计算机上得到解决,即

显然,你不能让他们合作按照你想要的方式。我建议创建static变量并将它们设置为您班级的+(void)initialise方法。

而且为条件,使用类似

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

因此,这将去

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

这不是一个类,它是一个头文件,因此它永远不会被初始化。 – Lolloz89 2012-08-08 10:02:45

+0

在你的AppDelegate类上使用它,这样就可以在整个应用程序中访问 – Olotiar 2012-08-08 10:04:59

0

使用的UIDevice宏 - http://d3signerd.com/tag/uidevice/

然后你就可以编写代码等;

if ([DEVICE_TYPE isEqualToString:DEVICE_IPAD]) { 

} 

if (IS_SIMULATOR && IS_RETINA) { 

} 
0

你不能定义这样做,因为他们是在编译时扩展。但是,您可以定义变量和基于用户界面成语设置它们的初始值:

// SomeClass.h 
extern CGFloat deviceDependentSize; 

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


    // etc. 
}