Xcode 14 Beta中NavigationStack引发的SwiftUI视图渲染异常问题
结论
你的代码写法不存在错误,这是Xcode 14.0 Beta 2(对应iOS 16.0 Beta 2,构建号20A5303i)中NavigationStack组件的系统级实现缺陷,该版本下模拟器、真机均可稳定复现该问题,并非个例。
问题复现
当你使用如下代码时,预期逻辑是视图触发onAppear后延迟1秒将@State修饰的布尔值置为true,背景从蓝色切换为红色,但实际运行时控制台可以正常打印>>>日志(证明状态已成功更新),UI始终停留在蓝色:
struct ContentView: View { @State private var bool: Bool = false var body: some View { NavigationStack(root: { Group(content: { if bool { Color.red } else { Color.blue } }) .onAppear(perform: { DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: { print(">>>") bool = true }) }) }) } }
将NavigationStack替换为已废弃的NavigationView后功能恢复正常,也能佐证问题出在新组件的早期Beta实现上。
临时适配方案
在你当前使用的Beta版本下,可以通过以下任意一种方式绕过该问题,不需要回退到NavigationView:
- 给条件渲染的外层容器绑定状态作为唯一ID,强制SwiftUI在状态变化时重建视图:
Group(content: { if bool { Color.red } else { Color.blue } }) .id(bool) // 新增这行绑定状态 .onAppear(perform: { // 原有定时更新逻辑保持不变 })
- 将
NavigationStackroot闭包内的条件渲染逻辑抽离为独立子视图,状态变更会正常触发子视图的重绘流程。 - 升级到Xcode 14正式版及以上版本,该Bug在iOS 16正式推送前的后续Beta版本中已被官方修复。
内容的提问来源于stack exchange,提问作者Vakho
相关产品推荐
相关产品推荐

