如何在部署目标 < 4.0 的项目中仅引用 iOS 4.0 枚举?

Posted

技术标签:

【中文标题】如何在部署目标 < 4.0 的项目中仅引用 iOS 4.0 枚举?【英文标题】:How do I reference iOS 4.0 only enums in a project with a deployment target < 4.0? 【发布时间】:2011-09-20 12:11:08 【问题描述】:

我正在尝试为 ios 编写一个应用程序,该应用程序将利用 iOS 4.0 的功能,但也适用于早期版本的操作系统 (3.1.3)。我已将部署目标设置为 3.1.3,将 Base SDK 设置为 4.3(最新)

具体来说,我正在尝试利用从遥控器截取命令的能力。

下面链接的文档对于解释如何(在运行时)检查类和方法的存在非常有用,但是当我尝试从 UIEvent 类中引用仅出现在iOS 4.0 及更高版本。

http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3

这是导致编译失败的代码部分:

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent    
    if (receivedEvent.type == UIEventTypeRemoteControl) 
        switch (receivedEvent.subtype) 
            case UIEventSubtypeRemoteControlTogglePlayPause:
                [self playPauseAction:nil];
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:
                [self previousChapter:nil];
                break;
            case UIEventSubtypeRemoteControlNextTrack:
                [self nextChapter:nil];
                break;
            default:
                break;
        
    

编译器抱怨:

error: 'UIEventTypeRemoteControl' undeclared (first use in this function)

UIEventTypeRemoteControl 是一个直到 4.0 才定义的枚举 (来自 UIEvent.h)

typedef enum 
    UIEventTypeTouches,
    UIEventTypeMotion,
    UIEventTypeRemoteControl,
 UIEventType;

typedef enum 
    // available in iPhone OS 3.0
    UIEventSubtypeNone                              = 0,

    // for UIEventTypeMotion, available in iPhone OS 3.0
    UIEventSubtypeMotionShake                       = 1,

    // for UIEventTypeRemoteControl, available in iOS 4.0
    UIEventSubtypeRemoteControlPlay                 = 100,
    UIEventSubtypeRemoteControlPause                = 101,
    UIEventSubtypeRemoteControlStop                 = 102,
    UIEventSubtypeRemoteControlTogglePlayPause      = 103,
    UIEventSubtypeRemoteControlNextTrack            = 104,
    UIEventSubtypeRemoteControlPreviousTrack        = 105,
    UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
    UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
    UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
    UIEventSubtypeRemoteControlEndSeekingForward    = 109,
 UIEventSubtype;

那么我该如何阻止编译器抱怨呢?

另外 - 我如何停止编译器警告 someClass 可能不响应 someMethod (我在运行时检查该类是否确实响应该方法,然后再调用它。)我想我可以在编译器设置 - 但在其他情况下这是一个有用的警告。

谢谢

【问题讨论】:

(回答我自己的问题)——我刚刚意识到我可以通过在我自己的代码中重新定义符号来解决这个问题——或者只使用它们引用的值而不是引用符号本身。 嗯-也许不是-我可以使用数值而不是 UIEventSubtypeRemote.... 项目,但我不知道如何使 if (receivedEvent.type == UIEventTypeRemoteControl) 行工作。 我无法重现使用“基于视图的应用程序”模板创建的新项目的问题。我将部署目标更改为 3.1.3 并向该项目添加了一个 UIView 子类,然后使用您提供的代码为 remoteControlReceivedWithEvent: 方法添加了一个覆盖。它编译得很好。因此,您的项目配置中可能还有其他东西正在搞砸...... 这是最奇怪的——我刚刚尝试了和你一样的东西,得到了同样的结果。看来,当 deployment_target 为 3.1.3 并且您编译到模拟器时,它可以正常编译,但如果您使用在实际 iOS 设备上启动的方案 - 即运行 iOS 4.3 的 iPhone,则编译失败。 我的测试项目:download.monkeyfood.com/testRemoteControl.zip 【参考方案1】:

好的 - 这是我发现的:

    将 deployment_target 切换到 4.3 然后 3.1.3 会导致出现编译错误和警告。

    一旦它们出现,您可以通过使用模拟器方案进行编译来消除它们。

    完成此操作后,您可以使用真实设备方案进行编译,并且错误和警告都消失了。

【讨论】:

以上是关于如何在部署目标 < 4.0 的项目中仅引用 iOS 4.0 枚举?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制部署后脚本在 Visual Studio 数据库项目中仅运行一次

如何在 DACPAC 部署中仅部署一组选定的存储过程?

如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?

如何在 .NET 3.5 项目中引用 .NET 4.0 程序集

如何使用 XCode 4 + 基本 SDK 4.3 为 iOS 4.0 设备构建?

如何指定引用的多目标项目的平台?