xcode 如何 Package 仅用于visionOS的Objective-C代码?

t1rydlwq  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(146)

下面是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使用了一段时间。虽然我没有得到第二个编译器错误,但它仍然说它不可用。
有什么解决办法吗?

5w9g7ksd

5w9g7ksd1#

不幸的是,Objective-C在@available方面很糟糕。如果你在Swift中编写相同的逻辑,你不会得到弃用警告。我不知道为什么Objective-C在这方面做得不好。
正如您所看到的,将xrOS 1.0添加到@available并没有消除弃用警告,尽管在运行时,由于@availableelse将不会被执行。因此,当它在运行时工作时,编译器不必要地抱怨它不应该抱怨的情况。
根据我自己的经验,唯一的解决方案是使用编译器指令。虽然我的经验是使用Mac Catalyst而不是visionOS,但问题是一样的。
您需要编写类似于以下内容的丑陋代码:

#if TARGET_OS_XROS // I'm guessing on the XROS - use code completion to see your options
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
#else
    if (@available(iOS 13.0, tvOS 13.0, *)) {
        indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
    } else {
        indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    }
#endif

最糟糕的部分是代码重复。你唯一的其他选择是转换到Swift或接受弃用警告。

相关问题