定义类的接口声明时的预处理器宏检查

时间:2014-10-06 19:04:03

标签: objective-c macos

我有一个NSWindowController,它有一个我在xib中子类化的窗口。直到10.10我将窗口作为子类(我们称之为WindowSubclassB),它是NSWindow的子类,并做了一些奇特的UI东西

现在有了Yosemite,我不再需要在Yosemite上继承我的窗口,但我仍然喜欢以前的OS X版本。

我虽然有几个不同的选项,例如为Yosemite和其他版本设置不同的.xib,但我的xib有很多部分,这意味着我必须维护两个不同的xib才能修复此

所以我试图做的是在构建时使用预处理器宏来确定要子类的哪个类

我试过了:

#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10

@interface GFMOSXMainWindow : NSWindow

#else

@interface GFMOSXMainWindow : INAppStoreWindow

#endif

但是代码没有在Yosemite上执行,因为它不是MINIMUM要求

我想要实现的目标如下:

#if CURRENT_OSX_VERSION == OSX_VERSION_10_10

@interface WindowSubclassA : NSWindow

#else

@interface WindowSubclassA : WindowSubclassB

#endif
但是,我不会看到这样一个宏,它在构建时会告诉我应用程序的当前版本OS X是什么。

另外,如果有人只知道如何以编程方式告诉UIWindowController它的@property窗口应该被初始化为什么类,那么这可能会解决整个问题:)

提前致谢!

2 个答案:

答案 0 :(得分:0)

您尝试执行的操作的问题在于,对于不同的系统版本,代码不会被多次编译。如果有的话,它可以针对不同的处理器进行不同的编译(例如OSX上的32/64位,或ios上的armv7,armv7和arm64)。 所以我认为以这种方式实现这一目标是不可能的。

我对替代解决方案还没有好主意,这不是使用objc运行时设置的一些狂野动态方法。

答案 1 :(得分:0)

NSWindowController initWithWindow:会这样做,但您必须自己初始化NSWindow。或者,您可以覆盖loadWindow并致电self.setWindow = <custom window>

我不确定是否回答了您原来的问题,但它确实回答了您的“同样”问题。