如何解决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
相关产品推荐
相关产品推荐

