16

我阅读了很多关于为这两个系统创建跨平台库的问题。每个答案都指向静态库作为解决方案。

我不想最终得到一个静态库,我想创建一个类,其中包含适用于 iOS 的方法和适用于 OS X 的对应方法。

-(void)createColor:(NSColor*);
-(void)createColor:(UIColor*);

我遇到的第一个问题是我找不到使用仅在特定系统中可用的类的方法。例如,我如何管理一个适用UIColor于 iOS 和NSColorOS X 的功能?

如果我为 iOS 创建一个项目,当我查看时我在标题列表中Foundation.h找不到。NSColor.h

我想使用TARGET_OS_MACandTARGET_OS_IPHONE定义来区分这两个系统......我走对了吗?

编辑以添加更多信息:

目前我有 2 个目标:iOSTestApp 和 OSxTestApp。对于这些目标,我根据系统包括了所需的框架。

仅当我选择 OSXTestApp 作为活动目标时才使用TARGET_OS_MAC和工作。TARGET_OS_IPHONE当我选择 iOSAppTest 时,Xcode 返回 OS X 数据类型的错误(即NSColor

这是产生这些错误的代码示例:

#if TARGET_OS_MAC
-(void)createColor:(NSColor*)color;    

#elif TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#endif

虽然如果我颠倒它的定义......这里是产生这些错误的代码示例:

#if TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#elif TARGET_OS_MAC
-(void)createColor:(NSColor*)color;

#endif
4

3 回答 3

22

您看到的问题源于TARGET_OS_IPHONE定义为TARGET_OS_MAC. (换句话说,TARGET_OS_IPHONE是 . 的更具体的情况TARGET_OS_MAC。或者TARGET_OS_MAC对于矩形和TARGET_OS_IPHONE正方形一样)。

因此,在为 iOS 编译时会出现以下代码错误,因为 iOS 将匹配这两个条件,但NSColor没有为 iOS 定义。

#if TARGET_OS_MAC
-(void)createColor:(NSColor*)color;    

#elif TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#endif

以下代码对两者都适用,因为对于 iOS,它匹配第一种情况,而对于 Mac OS X,它不匹配第一种情况,但匹配第二种情况。

#if TARGET_OS_IPHONE
-(void)createColor:(UIColor*)color;

#elif TARGET_OS_MAC
-(void)createColor:(NSColor*)color;

#endif
于 2013-03-10T16:03:06.163 回答
5

说到 UIColor/NSColor,我是这样处理的:

#if TARGET_OS_IPHONE
#define ImageClassName UIImage
#else
#define ImageClassName NSImage
#endif

然后,在头文件中,如果你只是传递实例,你可以使用 eg ImageClassName *

#if当您需要使用 UIColor/NSColor API 时,在您的代码中重复该块。

于 2013-03-12T00:35:24.290 回答
4

您谈论的两个定义设置为 1 或 0,具体取决于您编译的目的!(在编译时)

所以我猜你在正确的轨道上

例如

#if TARGET_OS_IPHONE
#import <CoreText/CoreText.h>
#elif TARGET_OS_MAC
#import <ApplicationServices/ApplicationServices.h>
#endif
于 2013-03-10T14:20:51.167 回答