如何为visionOS 封装Objective-C 代码?

问题描述 投票:0回答:4

我在 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。虽然我没有收到第二个编译器错误,但它仍然说它不可用。

关于如何解决这个问题有什么想法吗?

objective-c xcode visionos
4个回答
2
投票

使用

TARGET_OS_VISION
区分 RealityKit 仅目标:

#if TARGET_OS_VISION

#else

#endif // TARGET_OS_VISION

1
投票

使用

TARGET_OS_VISION

#if TARGET_OS_VISION

#else

#endif

1
投票

可悲的是,当谈到

@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 或接受弃用警告。


0
投票

如果您正在使用兼容的 iOS 目标(“为 iPhone 构建”或“为 iPad 构建”)构建 VisionOS,则

#if TARGET_OS_VISION
标志将不会触发为 true。

发现这个效果很好:

if (@available(visionOS 1, *)) {
    // NO-OP
} else {
    // Do your thing
}
© www.soinside.com 2019 - 2024. All rights reserved.