Xcode 16.1中NavigationLink搭配自定义DetailView无法更新问题咨询
在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
相关产品推荐
相关产品推荐

