2011-10-05 73 views
2

尽管在各地搜索,我找不到我的问题的答案。所以让我们看看你们都有多好。 :)xib中的预处理器指令?

我正在使用NSPopover的应用程序,该应用程序仅在10.7 Lion中可用,但我希望应用程序能够编译为10.5和更高版本。我正在使用预处理器指令来包装相关的popover代码,这看起来可以做到这一点......但是,我仍然遇到错误的最后一部分是Interface Builder中的.zib。如何清理在问题导航器中显示的错误,指出“类不可用:10.7之前的Mac OS X版本上的NSPopover”?

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED 
    #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 
     @property (assign) IBOutlet NSPopover *popover; 
    } 
    #endif 
#endif 

上面的工作在xxx.h和xxx.m's中,但是如何解决.xib错误呢?

尽管出现错误(红色),但它会成功建立。然而,我期望10.7的功能(popover)在10.7中工作,我错了,因为他们不......我在这里错过了什么?

+1

您是否正在构建应用的两个单独版本,一个定位为10.7+,一个定位为<10.7?还是你正在构建一个单一的二进制文件,只有当它运行在10.7+上时,它才能在运行时动态创建一个'NSPopover'? –

+0

简而言之,我希望创建一个运行在10.5 - 10.7的单个二进制文件,如果运行10.7,则使用NSPopover。 – glassfish

+0

@glassfish然后Citron的答案不是你想要的。预处理器在编译时运行,无法检测应用程序将在哪个版本的操作系统上运行。 – hypercrypt

回答

3

您不应该使用预处理器,但在运行时使用NSClassFromString()检查可用性。预处理器在编译时运行,因此它不会检测应用程序在哪个系统上运行。

为10.5,10.6和10.7中的每一个创建三个笔尖并加载所需的一个(或以代码形式),但在运行时选择哪一个,而不是编译时间,例如,

MyVC *vc = nil; 
if (NSClassFromString(@"NSPopover")) 
{ 
    vc = [NSViewController initWithNibName:@"MyVC-Lion" bundle:nil]; 
} 
else if (/* check for 10.6+ only features */) 
{ 
    vc = [NSViewController initWithNibName:@"MyVC-SL" bundle:nil]; 
} 
else 
{ 
    vc = [NSViewController initWithNibName:@"MyVC" bundle:nil]; 
} 
// ... 
+1

+1真,这是要走的路。有些人不明白预处理器不会在运行时运行。 –

+0

没错,但你有N个厦门国际银行保持...如果你决定要返工的共同部分,你就会有N次的工作要做。最终的应用程序将会更大。 所以,也许在你的情况/体验它更好地做到这一点,在我自己的,我肯定更喜欢只管理1厦门国际银行,并用一个小构建脚本来针对不同的平台。在用户界面更大,更痛苦的“N厦门国际银行”的做法会。 编辑:此外,你可能可以通过动态检查更换预处理器仅初始化10.7份在需要时(仍编程避免许多xibs) – Citron

+1

@Citron然后,只需使用您的部署目标支持的最复杂的NIB并添加留在代码中,但不要使用运行时检查而不要使用预处理器。你真的想为同一个操作系统的不同版本管理多个应用程序吗? – hypercrypt

1

对于您的问题,道歉,但可能的解决方法不是真正的答案:是不是可以创建xib的2个版本,并根据目标,编译或其他?这需要更多的工作来维护,但如果你的UI非常稳定,这应该是最简单的方法。

或者您可以编程方式添加您的“10.7特定”UI组件,而不是使用IB。如果你只有一个或几个弹出,它不应该很难做到,并且这些辅助处理器的警卫工作正常。

+0

虽然我还没有尝试过,但对我来说这似乎是一个非常有效的方法。谢谢!我只是用Objective-C开始工作,这是我的第一个项目,所以是的,我非常喜欢noob,不太清楚我的选项。如何根据他们正在运行的操作系统版本动态加载元素的任何提示? – glassfish

+0

简短回答:预处理器:)只需在IB中设置你的整个UI,然后为10.7特定的东西,以编程方式添加它们,使用预处理器来检测你正在构建的10.7或10.6和更低。 至于“如何以编程方式添加元素”,好吧,我认为大多数(如果不是全部)可可控件(如NSButton等)从NSView继承。 NSView有几种方法可以完成你想要的功能:addSubview,removeFromSuperView等。:) – Citron

+1

这不会动态检查,它需要你建立三个版本的应用程序! – hypercrypt