You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Objective-C适配visionOS时的@available判断与样式兼容问题

解决visionOS下UIActivityIndicatorViewStyleWhiteLarge不可用的问题

问题核心

你遇到的问题本质是:

  • 编译visionOS(原内部代号xrOS)时,UIActivityIndicatorViewStyleWhiteLarge属于平台不可用符号,即便运行时不会走到else分支,编译器仍会检查该符号的可用性并报错。
  • 早期Xcode版本对visionOS平台名称支持不完善,使用xrOS虽能通过编译,但@available是运行时判断逻辑,无法让编译器跳过else分支的符号检查。

解决方案

方案1:用编译宏直接屏蔽visionOS下的else分支

通过TARGET_OS_VISION编译宏,让visionOS编译时直接跳过else分支代码,彻底避免引用不可用符号:

#if !TARGET_OS_VISION
    if (@available(iOS 13.0, tvOS 13.0, *)) {
        indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
    } else {
        indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    }
#else
    // visionOS 直接使用Large样式
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
#endif

方案2:结合@available与编译宏优化判断

若想保留统一的@available结构,可在else分支内用编译宏屏蔽visionOS下的代码:

if (@available(iOS 13.0, tvOS 13.0, xrOS 1.0, *)) {
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
} else {
#if !TARGET_OS_VISION
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
#endif
}

补充说明

  • 若你的Xcode版本较低(未正式支持visionOS),可将TARGET_OS_VISION替换为TARGET_OS_XROS(早期内部版本的平台宏)。
  • 升级到Xcode 15及以上版本后,可直接使用visionOS 1.0作为@available的平台参数,配合TARGET_OS_VISION宏即可正常编译。

内容的提问来源于stack exchange,提问作者Charlie Fish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:37:28