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

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: {
    // 原有定时更新逻辑保持不变
})
  • 将NavigationStack root闭包内的条件渲染逻辑抽离为独立子视图,状态变更会正常触发子视图的重绘流程。
  • 升级到Xcode 14正式版及以上版本,该Bug在iOS 16正式推送前的后续Beta版本中已被官方修复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:18:22