SwiftUI中Accessing StateObject未挂载视图错误的解决求助
问题解决思路与修改后的代码
错误原因分析
init()中访问@FetchRequest变量:@FetchRequest依赖SwiftUI视图的环境上下文,视图初始化阶段(init())还未完成环境注入,此时访问teamsListe会触发错误——无法正确关联到视图的CoreData上下文,每次访问都会创建新实例。- 上下文混用:删除操作同时使用了单例的
DataController.shared.context和视图的viewContext,两个上下文实例不一致,导致数据更新后无法同步到@FetchRequest的结果集,出现添加团队不显示的问题。
修改后的代码
import SwiftUI import CoreData struct View_Teams: View { @Environment(\.managedObjectContext) var viewContext @FetchRequest(sortDescriptors: []) var teamsListe: FetchedResults<Team> var body: some View { NavigationStack { // iOS 15及以下替换为NavigationView List { ForEach(teamsListe) { team in NavigationLink(destination: View_TeamsDetail(passedTeam: team)) { Text(team.bezeichnung ?? "Error") } }.onDelete(perform: deleteTeam) } .navigationTitle("Teams") .toolbar { ToolbarItem(placement: .navigationBarTrailing) { NavigationLink(destination: View_TeamsDetail(passedTeam: nil)) { Text("add team") } } } .onAppear { // 视图加载完成后再访问FetchRequest结果 print("teamsListe has got \(teamsListe.count) teams") } } } private func deleteTeam(offsets: IndexSet) { withAnimation { offsets.map { teamsListe[$0] } .forEach(viewContext.delete) // 使用视图绑定的上下文 do { try viewContext.save() // 直接保存当前上下文 } catch { print("删除团队失败:\(error.localizedDescription)") } } } }
关键修改点
- 移除
init()方法,将打印逻辑移到.onAppear中,确保视图完成环境注入后再访问teamsListe。 - 删除操作统一使用视图的
viewContext,不再依赖单例上下文,保证数据更新能实时同步到列表。 - 调整"add team"按钮到导航栏工具栏,符合SwiftUI导航布局规范。
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

