【发布时间】:2017-05-25 12:19:48
【问题描述】:
我知道在 Swift 中可以使用 #available 而objective-c 不支持。
还有没有办法制作一个可以在 10.11 上运行但也支持 NSTouchbar(从 10.12 开始)的 os x 应用程序?
【问题讨论】:
标签: objective-c cocoa osx-elcapitan nstouchbar
我知道在 Swift 中可以使用 #available 而objective-c 不支持。
还有没有办法制作一个可以在 10.11 上运行但也支持 NSTouchbar(从 10.12 开始)的 os x 应用程序?
【问题讨论】:
标签: objective-c cocoa osx-elcapitan nstouchbar
#available 和 Swift 中的朋友是对 ObjC 中处理新功能和向后兼容性的更复杂方法的简化(和改进)。如果您使用的是 ObjC,则没有直接等效于 #available,因此您必须退回到那些旧方法。 Apple 的相关文档可以在 SDK Compatibility Guide 中找到。要点:
使用最新的 Xcode 8.x / macOS 10.12.x(或更高版本)SDK 构建您的项目。
将项目的 Base SDK 设置为 macOS 10.12(或更高版本),并将其最小部署目标设置为 10.11。
这使您正在寻找的 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,则不会使用额外的内存。
if 的主体可以在任何 macOS 10.2.2 机器上执行,而不仅仅是新的 MacBook。如果您同时部署到 10.2.2 和 10.11,则需要在调用之前检查是否存在任何新 API。
NSTouchBar 存在,例如,如果您需要根据模型状态或其他内容更新 Touch Bar 项目,所以你的答案仍然有效。)