Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c #如果选中(预处理器宏)以区分iPhone和iPad_Objective C_Iphone_C Preprocessor - Fatal编程技术网

Objective c #如果选中(预处理器宏)以区分iPhone和iPad

Objective c #如果选中(预处理器宏)以区分iPhone和iPad,objective-c,iphone,c-preprocessor,Objective C,Iphone,C Preprocessor,是否有一个构建预处理器宏,我可以用#if或#ifdef检查,以确定我当前的Xcode项目是为iPhone还是iPad构建的 编辑 正如一些答案所指出的,应用程序通常是通用的,并且相同的二进制文件可以在两种设备上运行。这些非常相似的设备之间的条件行为应该在运行时而不是编译时解决 NSString *deviceType = [UIDevice currentDevice].model; if([deviceType isEqualToString:@"iPhone"]) { //iPho

是否有一个构建预处理器宏,我可以用
#if
或#
ifdef
检查,以确定我当前的Xcode项目是为iPhone还是iPad构建的

编辑

正如一些答案所指出的,应用程序通常是通用的,并且相同的二进制文件可以在两种设备上运行。这些非常相似的设备之间的条件行为应该在运行时而不是编译时解决

NSString *deviceType = [UIDevice currentDevice].model;

if([deviceType isEqualToString:@"iPhone"]) {
    //iPhone
}
else if([deviceType isEqualToString:@"iPod touch"]) {
    //iPod Touch
}
else {
    //iPad
}
就我而言,您不能使用#if或#ifdef来执行此操作,但它是受支持的,因为Obj-C是C的严格超集

相关的:

本博客评论部分的一些想法

主要使用

UI_USER_INTERFACE_IDIOM()
例如:

#ifdef UI_USER_INTERFACE_IDIOM()
  #define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
  #define IS_IPAD() (false)
#endif

无法确定您的应用程序是为iPhone还是iPad构建的。预处理器
#如果在构建过程中解决了
指令。一旦你的应用程序被构建并标记为通用,它就必须在两台设备上正确运行。在构建过程中,没有人知道它稍后将安装在何处,并且一个构建可以安装在两个平台上

但是,您可能需要执行以下操作之一:

  • 在运行时检测设备型号

    为此,请使用
    [[UIDevice currentDevice]model]
    并与
    iPhone
    ipodtouch
    iPad
    字符串进行比较。这将返回正确的设备,即使在iPad上以兼容模式运行(仅适用于iPhone应用程序)。这对于使用情况分析非常有用

  • 在运行时检测用户界面习惯用法

    当为iPhone和iPad提供不同内容时,每个人都会检查这一点。使用
    [[UIDevice currentDevice]userInterfaceIdiom]
    并与
    UIUserInterfaceIdiomPhone
    UIUserInterfaceIdiomPad
    进行比较。您可能希望使用以下方便的方法:

    @implementation UIDevice (UserInterfaceIdiom)
    
    - (BOOL)iPhone {
        return (self.userInterfaceIdiom == UIUserInterfaceIdiomPhone);
    }
    + (BOOL)iPhone {
        return [[UIDevice currentDevice] iPhone];
    }
    
    - (BOOL)iPad {
        return (self.userInterfaceIdiom == UIUserInterfaceIdiomPad);
    }
    + (BOOL)iPad {
        return [[UIDevice currentDevice] iPad];
    }
    
    @end
    
    然后您可以使用:

    if ([[UIDevice currentDevice] iPhone]) { }
    // or
    if ([UIDevice iPhone]) { }
    // or
    if (UIDevice.iPhone) { }
    

  • swift的更新:

    无法使用预处理器。使全局功能成为

    func IS_IPAD() -> Bool { 
    ( return (UIDevice.respondsToSelector(Selector("userInterfaceIdiom"))) && (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad) )}
    

    我对AppleTV 4使用以下代码,因为UIUserInterfaceIdiomUnspecified似乎不起作用,我也找不到任何其他枚举:

    #ifdef TARGET_OS_IOS
    CGSize result = [[UIScreen mainScreen] bounds].size;
        if(result.width == 1920) {
            NSLog(@"tvOS");
        }
    #endif
    

    在黑暗时代之前,在《帝国》之前,我曾经在iPad上用过这个——OB1,哈,晚安。但是你可以在你知道的其他屏幕尺寸上使用类似的技术。

    这正是我所担心的,因为它们运行相同的应用程序。谢谢你的帮助。我想我可以想出一个配置,我可以根据这个配置创建一个#define。你不能对一个“通用二进制文件”进行编译时检查,因为它是为这两个文件构建的。如果你构建单独的iPad和iPhone应用程序,那么有很多方法,包括为不同的目标定义自己的编译器宏。这是不安全的!明天苹果更改字符串,你的应用程序就会停止正常工作。UIDevice的userInterfaceIdiom属性是最安全的方法。不安全。您不应该比较字符串,而应该使用UIDeviceAPI。这实际上是wwdc在apple讲座中建议的。为什么要费心使用宏呢?没有人支持低于3.2的iOS,因此
    UI\u USER\u INTERFACE\u IDIOM
    的优点是没有。这个问题和答案是从2010年开始的。@LouFranco抱歉,下次我会检查日期。我在两年前问过这个问题,现在我明白什么时候应该使用运行时与编译时检查。谢谢你的回答!我相信它会帮助别人。哦,日期!因此,我希望它能对某些人有所帮助。正如UI\u USER\u INTERFACE\u IDIOM()宏中所述,如果部署的iOS版本低于3.2,则只需检查选择器。使用Swift排除了这种情况。;)