我知道在 Swift 中可以使用 #available,而 objective-c 不支持这一点。
还有没有办法制作一个可以在 10.11 上运行但也支持 NSTouchbar(从 10.12 开始)的 os x 应用程序?
Swift 中的#available
和朋友是对 ObjC 中处理新功能和向后兼容性的更复杂的方法的简化(和改进)。如果您使用的是 ObjC,则没有直接等价物 #available
,因此您必须退回到那些旧方法。Apple关于此类的文档可以在SDK兼容性指南中找到。要点:
-
使用最新的 Xcode 8.x/macOS 10.12.x(或更高版本)SDK 构建项目。
-
将项目的基本 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
机身会执行。