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

Xcode 16.1中NavigationLink搭配自定义DetailView无法更新问题咨询

SwiftUI+SwiftData自定义DetailView不随NavigationLink选中项更新的问题

在Xcode 16.1(macOS 15.1)的SwiftUI+SwiftData跨平台应用模板中,NavigationSplitView的List里使用NavigationLink时出现异常:当NavigationLink内容是Text这类标准SwiftUI组件时,组件会随列表选中项变化自动更新;但换成自定义DetailView后,该视图完全不跟着选中项变化更新,预览和实际运行都存在这个问题。

问题原因

问题出在自定义DetailView的属性声明上:你给item添加了@State修饰符。

@State是用来管理视图内部私有状态的,它的初始值只会在视图第一次初始化时设置一次。当外部传入新的Item对象时,@State修饰的属性不会响应这个变化——它的生命周期完全由DetailView自己掌控,不会接收外部的更新通知。

而直接使用Text(item.stringVal)时,Text是直接绑定到外部传入的Item实例上,由于Item是SwiftData的@Model类,本身具备可观察性,当选中项切换时,新的Item实例会触发视图刷新,所以Text能正常更新。

解决方案

把DetailView里的@State修饰符去掉,直接用普通的let声明item(这里不需要修改item,用let更符合不可变数据的设计):

struct DetailView: View {
    let item: Item
    
    var body: some View {
        Text(item.stringVal)
    }
}

修改后,当NavigationLink切换选中项时,新的Item实例会被传入DetailView,视图会自动刷新并显示对应的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:52:38