objective-c - xib 中的预处理器指令?

标签 objective-c cocoa interface-builder

尽管到处搜索,我还是找不到问题的答案。那么让我们看看你们都有多好。 :)

我正在开发一个使用 NSPopover 的应用程序,该应用程序仅在 10.7 Lion 中可用,但我希望该应用程序能够针对 10.5 及更高版本进行编译。我正在使用预处理器指令来包装相关的弹出窗口代码,这似乎可以解决问题...但是,我仍然遇到错误的最后一个部分是 Interface Builder 中的 .zib。如何清除问题导航器中显示的错误“Class Unavailable: NSPopover on Mac OS X versions before 10.7”?

#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() 在运行时检查可用性。预处理器在编译时运行,因此它不会检测应用程序正在运行的系统。

创建三个 Nib ,10.5、10.6 和 10.7 各一个,然后加载您需要的 Nib (或在代码中执行),但在运行时而不是编译时选择哪个 Nib ,例如

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];
}
// ...

关于objective-c - xib 中的预处理器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668615/

相关文章:

objective-c - 如何解除多个 View Controller ?

ios - 动画约束正在打破其他约束

objective-c - 如何使用 Objective-C 和 Interface Builder 切换 View

ios - 如何使 View 像表格 View 单元格一样突出显示

objective-c - 手势识别器的正确 MVC 模式

ios - 如何创建自己处理协议(protocol)的 UITableViewController 子类

objective-c - 如何将 NSDictionary 的值转换为 NSString?

cocoa-touch - NSDateFormatter 的格式化字符串以生成毫秒

swift - 在 macOS 中将 WKWebView 内容转换为 PDF

ios - 如何更改平板电脑上的 labelCount? (当有更多空间可用时)