我在 Objective-C 中有以下代码:
if (@available(iOS 13.0, tvOS 13.0, *)) {
indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
} else {
indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
}
但这会产生错误。
'UIActivityIndicatorViewStyleWhiteLarge' is unavailable: not available on xrOS
我想我需要第一个条件来运行,所以它甚至不会尝试访问
UIActivityIndicatorViewStyleWhiteLarge
。
但是当我将线路更改为
if (@available(iOS 13.0, tvOS 13.0, visionOS 1.0, *))
时。我收到以下错误:
Unrecognized platform name visionOS
我还尝试将其更改为
xrOS 1.0
(因为我听说一些内部用法有一段时间将其用作xrOS。虽然我没有收到第二个编译器错误,但它仍然说它不可用。
关于如何解决这个问题有什么想法吗?
使用
TARGET_OS_VISION
区分 RealityKit 仅目标:
#if TARGET_OS_VISION
#else
#endif // TARGET_OS_VISION
使用
TARGET_OS_VISION
#if TARGET_OS_VISION
#else
#endif
可悲的是,当谈到
@available
时,Objective-C 很糟糕。如果您要在 Swift 中编写相同的逻辑,您将不会收到弃用警告。我不知道为什么 Objective-C 在这方面做得不好。
正如您所见,将
xrOS 1.0
添加到 @available
并不能消除弃用警告,尽管在运行时,由于 else
,@available
不会被执行。因此,虽然它在运行时工作,但编译器不必要地抱怨不应该的情况。
根据我自己的经验,唯一的解决方案是使用编译器指令。虽然我的经验是使用 Mac Catalyst 而不是 VisionOS,但问题是一样的。
你需要编写类似于以下的丑陋代码:
#if TARGET_OS_VISION
indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
#else
if (@available(iOS 13.0, tvOS 13.0, *)) {
indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
} else {
indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
}
#endif
其中不好的部分是代码重复。您唯一的其他选择是转换为 Swift 或接受弃用警告。
如果您正在使用兼容的 iOS 目标(“为 iPhone 构建”或“为 iPad 构建”)构建 VisionOS,则
#if TARGET_OS_VISION
标志将不会触发为 true。
发现这个效果很好:
if (@available(visionOS 1, *)) {
// NO-OP
} else {
// Do your thing
}