繁体   English   中英

xib中的预处理程序指令?

[英]Preprocessor Directive in xib?

尽管到处搜索,但找不到我的问题的答案。 那么,让我们看看你们的表现如何。 :)

我正在开发一个使用NSPopover的应用程序,该应用程序仅在10.7 Lion中可用,但我希望该应用程序编译为10.5或更高版本。 我正在使用预处理器指令来包装相关的弹出代码,这似乎可以解决问题……但是,我仍然遇到错误的最后一部分是Interface Builder中的.zib。 如何清除问题导航器中显示的错误,指出“类不可用:Mac OS X 10.7之前的版本上的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,但是如何解决.xib错误?

尽管有错误(红色),它仍可以成功构建。 但是,我期望10.7功能(弹出窗口)在10.7中正常工作是错误的,因为它们不起作用...我在这里缺少什么?

您不应为此使用预处理器,而应在运行时使用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];
}
// ...

对于您的问题,抱歉,不是一个真正的答案,但是有两种可能的解决方法:是否可能无法创建2个版本的xib,并且取决于目标,在其上进行编译还是在另一个上进行编译? 这需要维护一些工作,但是如果您的用户界面非常稳定,这应该是最简单的方法。

或者,您可以通过编程方式添加“ 10.7特定” UI组件,而不使用IB。 如果您只有一个或几个弹出窗口,那应该不难做,并且前处理器防护程序可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM