求助:SwiftUI中CoreData添加数据后界面不更新,仅重启预览生效
解决SwiftUI+CoreData添加数据后视图不实时更新的问题
问题根源
你遇到的核心问题是:ProfileMenu和CircleView各自初始化了独立的CircleViewModel实例,两者的数据源完全隔离。
- 删除操作在ProfileMenu自身的ViewModel上执行,修改后
@Published修饰的savedCircles会触发视图刷新; - 添加操作在CircleView的独立ViewModel上执行,ProfileMenu的ViewModel完全感知不到数据变化,因此不会更新界面。
修复方案
让两个视图共享同一个CircleViewModel实例,具体步骤如下:
1. 修改CircleView,接收外部传入的ViewModel
将CircleView内部自行创建ViewModel的代码,改为接收外部传入的实例:
struct CircleView: View { // 移除原来的@StateObject创建代码 // @StateObject var vm = CircleViewModel() // 改为接收外部传入的ViewModel @ObservedObject var vm: CircleViewModel // 其余代码保持不变... }
同时更新CircleView的预览代码:
struct CircleView_Previews: PreviewProvider { static var previews: some View { CircleView(vm: CircleViewModel(), showCircleInfoScreen: .constant(true)) } }
2. 在ProfileMenu中传递ViewModel给CircleView
修改ProfileMenu中CircleView的调用代码,把自身的ViewModel传递过去:
// ProfileMenu的body中 if showCircleInfoScreen { // 传递当前的vm实例给CircleView CircleView(vm: vm, showCircleInfoScreen: $showCircleInfoScreen) }
额外优化(可选)
如果你的App中有多个视图需要访问Circle数据,可以用@EnvironmentObject实现全局共享:
- 在App入口注入ViewModel:
@main struct YourApp: App { @StateObject private var circleVM = CircleViewModel() var body: some Scene { WindowGroup { ProfileMenu() .environmentObject(circleVM) } } }
- 在ProfileMenu和CircleView中直接使用:
// ProfileMenu中 @EnvironmentObject var vm: CircleViewModel // CircleView中 @EnvironmentObject var vm: CircleViewModel
这种方式无需手动传递ViewModel,更适合复杂的多视图场景。
内容的提问来源于stack exchange,提问作者Nick Foley
相关产品推荐
相关产品推荐

