6

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

完整的解释:

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

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

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

L.

4

5 回答 5

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")
于 2012-08-08T10:03:26.073 回答
2

#define在编译时解析,即在您的计算机上

显然,您不能以您想要的方式使它们成为有条件的。我建议创建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
于 2012-08-08T10:01:15.310 回答
0

嗨,在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;
}

使用此行从您的班级中调用它

SecondVC *obj_secondvc = [[SecondVC alloc] initWithNibName:[AppDelegate isAppRunningOnIpad:@"SecondVC"] bundle:nil]; 
于 2012-08-08T10:00:19.933 回答
0

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

然后你可以编写如下代码;

if ([DEVICE_TYPE isEqualToString:DEVICE_IPAD]) {

}

或者

if (IS_SIMULATOR && IS_RETINA) {

}
于 2012-08-08T10:04:38.940 回答
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.
}
于 2012-08-08T10:09:50.870 回答