创建iOS/OS X跨平台类

Mat*_*oal 16 macos cocoa cocoa-touch objective-c ios

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

我不想最终得到一个静态库,我想用iOS的方法和OS X的对应方创建一个类.

-(void)createColor:(NSColor*);
-(void)createColor:(UIColor*);
Run Code Online (Sandbox Code Playgroud)

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

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

我想用TARGET_OS_MACTARGET_OS_IPHONE定义来区分两个系统......我是在正确的方式?

编辑添加更多信息:

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

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

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

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

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

#endif
Run Code Online (Sandbox Code Playgroud)

如果我反转定义它的工作原理......这里是一个产生这些错误的代码示例:

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

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

#endif
Run Code Online (Sandbox Code Playgroud)

NSG*_*God 21

你所看到的问题来自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
Run Code Online (Sandbox Code Playgroud)

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

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

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

#endif
Run Code Online (Sandbox Code Playgroud)


pau*_*kow 5

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

#if TARGET_OS_IPHONE
#define ImageClassName UIImage
#else
#define ImageClassName NSImage
#endif
Run Code Online (Sandbox Code Playgroud)

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

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