【问题标题】:cocoa build for os x 10.11 with NSTouchbar support带有 NSTouchbar 支持的 os x 10.11 的 cocoa 构建
【发布时间】:2017-05-25 12:19:48
【问题描述】:

我知道在 Swift 中可以使用 #available 而objective-c 不支持。

还有没有办法制作一个可以在 10.11 上运行但也支持 NSTouchbar(从 10.12 开始)的 os x 应用程序?

【问题讨论】:

    标签: objective-c cocoa osx-elcapitan nstouchbar


    【解决方案1】:

    #available 和 Swift 中的朋友是对 ObjC 中处理新功能和向后兼容性的更复杂方法的简化(和改进)。如果您使用的是 ObjC,则没有直接等效于 #available,因此您必须退回到那些旧方法。 Apple 的相关文档可以在 SDK Compatibility Guide 中找到。要点:

    1. 使用最新的 Xcode 8.x / macOS 10.12.x(或更高版本)SDK 构建您的项目。

    2. 将项目的 Base SDK 设置为 macOS 10.12(或更高版本),并将其最小部署目标设置为 10.11。

    3. 这使您正在寻找的 AppKit 类/方法成为“弱链接”,因此您可以在运行时检查它们的存在。例如:

      if ([NSTouchBar class]) {
          self.touchBar = [[NSTouchBar alloc] init];
          self.touchBar.delegate = self;
          self.touchBar.defaultItemIdentifiers = @[ /*...*/ ];
          //...
      }
      

      在触控栏支持之前的 macOS 版本中,[NSTouchBar class] 返回 nil,因此不会发生任何触控栏使用情况。在支持触摸栏的版本中,您的 if 正文会执行。

    【讨论】:

    • 代码应该实现makeTouchBar,而不是直接设置touchBar;则无需检查,如果不存在 Touch Bar,则不会使用额外的内存。
    • 这不是测试 Touch Bar hardware 是否存在;它正在检查使用它所需的 API。这个if 的主体可以在任何 macOS 10.2.2 机器上执行,而不仅仅是新的 MacBook。如果您同时部署到 10.2.2 和 10.11,则需要在调用之前检查是否存在任何新 API。
    • 是的,但是如果您使用 -makeTouchBar,则不需要包装任何内容,除非您在设置之外检查它(类/方法,而不是硬件)。
    • 无论如何,我最初评论的第一部分是推荐的;这样,即使在 10.12.2 上,如果 Mac 没有触摸栏,甚至不会分配 NSTouchBar。 Apple 工程师有一条关于它的推文,但我现在找不到。 ://
    • (如果您在设置/委托之外使用它,您仍然需要确保 NSTouchBar 存在,例如,如果您需要根据模型状态或其他内容更新 Touch Bar 项目,所以你的答案仍然有效。)
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多