1

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

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

4

1 回答 1

4

#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身体会执行。

于 2017-01-10T23:00:22.237 回答