【问题标题】:#ifdef Condition not working the way that I want it to#ifdef 条件没有按我想要的方式工作
【发布时间】:2013-01-28 07:41:56
【问题描述】:

我正在以编程方式创建 UniversalApp。在我的应用程序中,我有 2 个常量类,并且基于设备我想导入我的常量类。但它总是打开“Constants_iPad”类。偶数条件是真还是假。

#ifndef iPad
    #define iPad    (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#endif
#ifndef iPhone
    #define iPhone  (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)
#endif


#ifdef iPad  ------> always excute this condition either True of False.
    #import "Constants_iPad.h" // if device is iPad
#else
    #import "Constants_iPhone.h" // if device is iPhone
#endif

当我使用 consol 打印时

 #ifdef iPad
     NSLog(@"iPad = %d",iPad);
 #endif

如果条件错误则打印“0”,如果条件为真则打印1

【问题讨论】:

  • 问题是预处理指令#ifdef实际上并没有执行你的语句,而只是找出你的变量iPad是否被定义。在您的代码中,它始终被定义,所以 #ifdef iPad 始终为真。
  • 那么有什么方法可以解决我的问题。如果有,请给我一些指导。
  • 我认为这是不可能的。导入语句是编译器在编译时执行的操作。 “#define iPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)”是你可以在运行时使用的东西,而不是在编译时
  • 因此您无法检查运行时条件并根据真假导入某些内容。在任何地方使用 if 语句或添加一些辅助方法来为您处理此检查

标签: iphone ios objective-c ipad ios-universal-app


【解决方案1】:

你试过 #ifdef TARGET_IPHONE 或 #ifdef TARGET_IPAD 而不是 #ifndef iPhone 吗?我不确定#ifndef iPhone 宏?但除此之外,我认为在导入类的预编译期间确定目标是不可能的。

【讨论】:

  • 他说他想要一个通用的应用程序,所以它应该支持两者,并且没有针对不同目标的不同代码......
  • "lnafziger" 是对的,是的,我想让我的应用同时支持这两种功能,并且没有针对不同目标的不同代码...
  • #ifdef TARGET_IPAD 显示“未找到符号”..这不起作用,请您详细说明一下..
【解决方案2】:

您的逻辑存在一些问题,但最大的问题是您无法确定用户是在 iPad 还是 iPhone 上运行程序,直到程序实际在设备上运行(long编译后)!

虽然这实际上并不能帮助您完成您正在尝试做的事情,但它总是导入您的 Constants_iPad.h 的原因是因为在顶部,您定义了名为 iPad 的宏,然后在下面说“如果 iPad已定义,然后导入此文件”。好吧,它总是被定义的。你刚刚在第二行做了。

要完成您尝试做的事情,您需要包含这两个文件(确保您的定义是唯一的)。

然后,在您的实现文件中,您使用如下内容:

if (iPad) {
    // Use the iPad definitions to do what you want
} else {
    // Use the iPhone definitions
}

【讨论】:

  • 当我在 consol 上使用 #ifdef iPad NSLog(@"iPad = %d",iPad); #endif 如果条件错误则打印“0”,如果条件为真则打印 1
  • 应该如此。它告诉你 iPad 是否为defined,而不是is 是否为 iPad。
  • 我想导入类,而在你的路上,这对于导入类是不可能的。
  • 您的课程需要同时支持这两者。在类中使用上述方法以确定如何响应它是否特定于一个设备或另一个。您的大部分代码应该适用于这两种设备,并检查不同的相应设备。
【解决方案3】:

编辑:您必须使用#if 而不是#ifdef。正如this 所说,这是一个常见的错误。

#if TARGET_OS_IPAD
    #import "Constants_iPad.h" // if device is iPad
#else
    #import "Constants_iPhone.h" // if device is iPhone
#endif

和其他宏 here.

【讨论】:

  • T_12 :- thnx for r replay 我试试这个,但是当我选择目标任何目标 ipad 或 iphone 时它​​对我不起作用,它始终为 true 1 条件,当它使用 TARGET_OS_IPAD 时它会显示错误。请帮我解决这个问题。
  • #ifdef TARGET_IPAD 显示“未找到符号”..这不起作用,请您详细说明一下..
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2021-12-15
  • 2019-01-18
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多