我试图建立一个宏跟踪应用程序,但当我编辑我的数据,它从来没有保存
@main
struct Macro_TrackerApp: App {
var sharedModelContainer: ModelContainer = {
let schema = Schema([
Macros.self,
])
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
do {
return try ModelContainer(for: schema, configurations: [modelConfiguration])
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}()
var body: some Scene {
WindowGroup {
TabBarView()
}
.modelContainer(sharedModelContainer)
}
}
@Model
class Macros: Identifiable {
@Attribute(.unique) var id: String = UUID().uuidString
var date: Date
var fat: CGFloat
var carbs: CGFloat
var proteins: CGFloat
var calories: CGFloat
init(id: String = UUID().uuidString, date: Date, fat: CGFloat, carbs: CGFloat, proteins: CGFloat, calories: CGFloat = 0) {
self.id = id
self.date = date
self.fat = fat
self.carbs = carbs
self.proteins = proteins
self.calories = calories
}
}
func updateMacros(dailyMacros: Macros) {
dailyMacros.fat += quickAddFat
dailyMacros.carbs += quickAddCarbs
dailyMacros.proteins += quickAddProteins
dailyMacros.calories += ((quickAddFat * 9) + (quickAddCarbs * 4) + (quickAddProteins * 4))
}
@Environment(\.modelContext) private var modelContext
@Query var macros: [Macros]
var dailyMacros: Macros? {
macros.first(where: { Calendar.current.isDate($0.date, equalTo: Date.now, toGranularity: .day) }) ?? nil
}
HStack {
CustomButtonView(action: {
viewModel.updateMacros(dailyMacros: dailyMacros)
print(dailyMacros.carbs)
print(macros.first(where: { Calendar.current.isDate($0.date, equalTo: Date.now, toGranularity: .day) })?.carbs)
}, label: "Appliquer", color: Color.macroTrackerButton, width: 200, height: 50)
}
如果我的查询返回一个空数组,我就调用这个函数
func insert() {
modelContext.insert(Macros(date: Date.now, fat: 0, carbs: 0, proteins: 0))
}
型
我不能理解,我只看到todo应用程序教程,所以它并没有真正帮助我谢谢!
我试着手动保存,但没有任何变化,我试图打印我的var数据只是为了知道它是否编辑得很好,是的..所以我不明白为什么每次我杀死应用程序,我所有的对象返回到初始状态,他们没有删除,但我不能编辑他们,它不保存
代码库:https://github.com/Killianoni/Macro-Tracker
1条答案
按热度按时间k2fxgqgv1#
这与SwiftData无关,UI中所做的所有更改都已正确保存,可以通过重新启动应用程序或激活Core Data的调试日志来验证
您可以通过进入Edit Scheme. -> Run -> Arguments并添加
字符串
代码的实际问题在于视图,首先,
DiaryView
中的视图模型应该声明为@StateObject
,因为它属于视图型
然后在
ProgressCircleView
中,我们有相反的问题,属性number1
不属于视图,也不被视图更改,所以它不是@State
属性,所以将它和其他属性更改为let
。型
有了这些变化,你的UI应该会得到正确的更新。