SwiftUI直升机游戏Core Data实现报错:FetchedResults无name成员
问题原因
你遇到的Value of type 'FetchedResults' has no member 'name'报错是变量引用错误导致的:
在ScoresList的ForEach循环中,你声明的单个循环元素变量名为score,但你在Text中调用的是整个查询结果集合scores的name属性,FetchedResults是数组类型,本身不存在name属性,所以触发编译报错。
修复方案
1. 修正ScoresList的循环引用
把Text("\(scores.name!")改成调用单个元素score的属性即可,同时可以加个空值判断避免崩溃,也可以给查询加个排序规则让分数展示更合理:
import SwiftUI import CoreData struct ScoresList: View{ @Environment(\.managedObjectContext) var context // 按分数字符串倒序排序,也可以后续把name改成Int16类型更适合做数值排序 @FetchRequest(entity: Scores.entity(), sortDescriptors: [NSSortDescriptor(key: "name", ascending: false)]) var scores: FetchedResults<Scores> var body: some View{ List{ ForEach(scores, id: \.self) { score in Text("\(score.name ?? "无有效分数")") } } } }
2. 可选优化GameView的保存逻辑
现在你需要用户手动修改TextField里的分数才能保存,完全可以在游戏结束自动把当前分数赋值给newScoreValue,省去手动操作:
在GameView的body末尾(edgesIgnoringSafeArea之前)加个状态监听:
.onChange(of: isPaused) { paused in if paused { newScoreValue = "\(score)" } }
3. 确认Core Data上下文注入
要确保你的项目入口已经把Core Data的托管上下文注入到SwiftUI环境中,不然保存和查询都会失效:
- 如果是SwiftUI App生命周期(有@main的App结构体):
@main struct HelicopterApp: App { let persistenceContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer var body: some Scene { WindowGroup { ContentView() .environment(\.managedObjectContext, persistenceContainer.viewContext) } } }
- 如果是UIKit SceneDelegate生命周期,在
willConnectTo方法中添加:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let contentView = ContentView().environment(\.managedObjectContext, context) // 后续把contentView赋值给rootViewController的rootView即可
另外还要确认你的Core Data模型文件名称和NSPersistentContainer初始化传入的name一致,都是Scores,避免存储加载失败。
内容的提问来源于stack exchange,提问作者MixedByInstinct
相关产品推荐
相关产品推荐

