ios - 创建 iOS/OS X 跨平台类

标签 ios objective-c macos cocoa-touch cocoa

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

我不想以静态库结束,我想创建一个类,其中包含适用于 iOS 的方法及其对应的 OS X。

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

我遇到的第一个问题是我找不到一种方法来使用仅在特定系统中可用的类。因此,例如,我如何管理一个在 iOS 中与 UIColor 一起工作而在 OS X 中与 NSColor 一起工作的函数?

如果我为 iOS 创建一个项目,当我查看 Foundation.h 时,我无法在 header 列表中找到 NSColor.h

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

编辑以添加更多信息:

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

使用 TARGET_OS_MACTARGET_OS_IPHONE 仅当我选择 OSXTestApp 作为事件目标时才有效。当我选择 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

最佳答案

您看到的问题是因为 TARGET_OS_IPHONE 被定义为 TARGET_OS_MAC 的变体。 (换句话说,TARGET_OS_IPHONETARGET_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

关于ios - 创建 iOS/OS X 跨平台类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15323109/

相关文章:

ios - Objective C 中的类方法和对象属性存在错误

regex - 为什么 grep 不从安全实用程序的输出中提取?从 echo 作品中进行比较提取

objective-c - 显示应用的构建日期

objective-c - 识别 UIWebView 文件类型

iphone - 更新框架后 UITextView 不滚动

ios - 滚动表格单元格图像后,快速显示以前的图像。虽然图像 url 显示正确

c++ - 基于 IOKit 的 kext 驱动程序中的单例类

macos - 原生 OS X 应用程序是否可以读取和复制 Spotlight 搜索索引?

ios - [NSDecimalNumber 保留] : message sent to deallocated instance 0x174222220, 但为什么呢?

ios - 知道 Swift 中弱变量什么时候变成 nil 吗?