我有一个Constants.h文件,其实际上包含一些全局常量。由于我的应用程序是为iPhone和iPad构建的,我想为两种设备类型定义相同的常量(即具有相同的名称)。
要获得完整的解释:
/******** pseudo code *********/
if (deviceIsIPad){
#define kPageMargin 20
}
else {
#define kPageMargin 10
}
我该怎么做? 感谢。
升。
答案 0 :(得分:18)
在预处理步骤中无法获得设备类型。它在运行时期间动态确定。您有两种选择:
创建两个不同的目标(分别用于iPhone和iPad)并在那里定义宏。
创建插入如下表达式的宏:
#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")
答案 1 :(得分: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
答案 2 :(得分:0)
您好在appdelegate
class
+(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];
答案 3 :(得分:0)
使用UIDevice宏 - http://d3signerd.com/tag/uidevice/
然后你可以编写像;
这样的代码if ([DEVICE_TYPE isEqualToString:DEVICE_IPAD]) {
}
或
if (IS_SIMULATOR && IS_RETINA) {
}
答案 4 :(得分: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.
}