为啥我在 SwiftUI 中重新打开应用程序时没有保存 CoreData?
Posted
技术标签:
【中文标题】为啥我在 SwiftUI 中重新打开应用程序时没有保存 CoreData?【英文标题】:Why is CoreData not saved when I reopen the app in SwiftUI?为什么我在 SwiftUI 中重新打开应用程序时没有保存 CoreData? 【发布时间】:2020-11-30 13:10:47 【问题描述】:我遇到了涉及 CoreData 和终止应用程序的问题。当我终止应用程序(即使我保存了托管对象上下文)并重新打开它时,由于某种原因它看起来仍然相同。 . .
我对 CoreData 有点陌生,但有没有办法更新数据?我还将分享应用程序的图片以供参考和下面的代码:
List
ForEach(tasks, id: \.id) task in CellView(completionState: task.completionState, title: task.title!,
priority: task.priority ?? "")
这段代码在 UI 中用于显示数据,它可以工作,那么我们就有了 CellView 结构
struct CellView: View
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Task.entity(), sortDescriptors: []) var tasks: FetchedResults<Task>
@State var completionState: Bool
@State var title: String
@State var priority: String
@State var actionSheetPresented = false
var body: some View
HStack
//Mark task complete//
Button(action:
completionState.toggle()
do
try self.moc.save()
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
)
switch completionState
case false:
Image(systemName: "square")
.resizable()
case true:
Image(systemName: "checkmark.square")
.resizable()
.foregroundColor(.green)
.frame(width: 30, height: 30, alignment: .center)
.buttonStyle(PlainButtonStyle())
Text(title)
.foregroundColor(.black)
Spacer()
switch priority
case "Dorment":
Button(action: self.actionSheetPresented.toggle())
Image(systemName: "zzz")
.resizable()
.frame(width: 30, height: 30, alignment: .center)
.buttonStyle(PlainButtonStyle())
.padding(.trailing, 10.0)
default:
Button(action: self.actionSheetPresented.toggle())
Text(priority)
.background(Image("buttonBackground")
.resizable()
.frame(width: 40, height: 40, alignment: .center)
.cornerRadius(30.0))
.foregroundColor(.white)
.buttonStyle(PlainButtonStyle())
.padding(.trailing)
.actionSheet(isPresented: $actionSheetPresented, content:
ActionSheet(title: Text("Change the priority"), message: nil, buttons: [
.default(Text("A"))
priority = "A"
do
try self.moc.save()
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
,
.default(Text("B"))
priority = "B"
do
try self.moc.save()
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
,
.default(Text("C"))
priority = "C"
do
try self.moc.save()
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
,
.default(Text("Dorment"))
priority = "Dorment"
do
try self.moc.save()
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
,
.cancel()
])
)
.environment(\.managedObjectContext, self.moc)
是的。 . .我知道其中一些保存是不正确的。 . .但我真的不知道如何让它工作。
我还有一些图片可以用来理解我的意思:
这是第一张图,主要是初始状态:
这是我重新打开应用程序后应该保持的状态。 . .但它没有:
【问题讨论】:
【参考方案1】:我看不到您在哪里设置了要保存的数据。虽然您没有列出您的核心数据模型,但我假设实体是Task
,属性是title
、priority
和completionState
。因此,要保存数据,需要在托管对象上下文中定义一个变量来保存数据,将数据添加到变量中,然后将数据保存到上下文中:
let task = Task(context: self.moc)
task.title = self.title
task.priority = self.priority
task.completionState = self.completionState
do
try self.moc.save()
catch
// catch any errors here
您所做的只是告诉上下文保存已经存在的数据而不以任何方式更改它。我还会将此模式提取到您可以调用的函数中,而不是将其放在操作表的每个部分中。
【讨论】:
好吧,我会告诉你结果如何!以上是关于为啥我在 SwiftUI 中重新打开应用程序时没有保存 CoreData?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SwiftUI 中的 URL Scheme/onOpenURL 总是打开一个新窗口?
为啥当我在 UIHostingController 中使用 SwiftUI-transition 时,它不能按预期工作?
我在excel中使用VBA宏程序时,报错无法执行,为啥!前提,程序没有问题,因为单位机器运行良好
为啥后台和重新打开应用程序不调用 viewDidAppear?