【问题标题】:Creating an iOS/OS X cross-platform class创建一个 iOS/OS X 跨平台类
【发布时间】:2013-02-25 17:11:04
【问题描述】:

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

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

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

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

如果我为 iOS 创建一个项目,当我查看 Foundation.h 时,我在标题列表中找不到 NSColor.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

如果我颠倒定义,它会起作用...... 下面是产生这些错误的代码示例:

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

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

#endif

【问题讨论】:

  • 回答说你需要一个用于 IOS 的静态库——我不明白你的其余问题
  • 我无法理解否决票。反正我不想创建动态库...如果我告诉你我想创建一个 Helper Class 多平台听起来更好吗?
  • 因为我真的不清楚这个问题,而且你的评论没有帮助:D 标题是“创建非静态库”,而你说“我不想要动态库”:D
  • 您是否考虑过使用 CGColor 来代替?如果您只是编写类似的方法,那么为每个目标编写和维护单独的文件可能会更容易。
  • @PaulArmstrong 没有帮助 ^^ 无论如何这只是一个例子!

标签: ios objective-c macos cocoa-touch cocoa


【解决方案1】:

您看到的问题源于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

【讨论】:

    【解决方案2】:

    对于 UIColor/NSColor,我是这样处理的:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      例如

      #if TARGET_OS_IPHONE
      #import <CoreText/CoreText.h>
      #elif TARGET_OS_MAC
      #import <ApplicationServices/ApplicationServices.h>
      #endif
      

      【讨论】:

        猜你喜欢
        • 2014-07-23
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多