SwiftData向数组添加元素导致Xcode预览崩溃求助
问题排查与修复方案
1. 预览视图模型传参错误
你的AccountView要求接收AccountModel类型参数,但预览代码里传递的是AccountEntry(),类型完全不匹配。同时容器创建时需包含所有用到的模型,且要将实例插入上下文托管:
#Preview { let config = ModelConfiguration(isStoredInMemoryOnly: true) // 预览用内存存储,避免持久化干扰 let container = try! ModelContainer(for: AccountModel.self, AccountEntry.self) // 创建示例账户并插入上下文 let sampleAccount = AccountModel(name: "测试账户", type: .yourType) // 替换为实际AccountType枚举值 container.mainContext.insert(sampleAccount) return VStack { AccountView(model: sampleAccount) }.modelContainer(container) }
2. SwiftData未明确关联关系
AccountModel与AccountEntry的一对多关系需用@Relationship标注,否则SwiftData无法正确管理关联:
@Model class AccountModel { @Attribute(.unique) var uuid: UUID let name: String var type: AccountType @Relationship(deleteRule: .cascade) var entries: [AccountEntry] // 添加关联标注 init(name: String, type: AccountType) { self.name = name uuid = UUID() self.type = type entries = [] } func addEntry(_ entry: AccountEntry) { entries.append(entry) // 确保新Entry被上下文托管 if entry.modelContext == nil { modelContext?.insert(entry) } } }
3. 自定义枚举字典的存储处理
AccountEntry中的data属性是含自定义枚举的字典,需添加外部存储标注让SwiftData正确处理:
@Model final class AccountEntry { @Attribute(.unique) var uuid: UUID var entryDate: Date @Attribute(.externalStorage) var data: [String: AccountEntryValue] // 添加外部存储属性 init() { uuid = UUID() entryDate = Date.now data = [:] } }
同时确保DuedateCadence枚举实现Codable协议,否则AccountEntryValue的编码会失效。
4. 未托管模型对象导致崩溃
点击按钮创建的AccountEntry未被SwiftData上下文托管,直接添加会引发崩溃。上面修改的addEntry方法已包含上下文插入逻辑,确保新模型被正确管理。
内容的提问来源于stack exchange,提问作者CalebK
相关产品推荐
相关产品推荐

