保存数据时出现问题,将 CoreData 与 SwiftUI 一起使用
Posted
技术标签:
【中文标题】保存数据时出现问题,将 CoreData 与 SwiftUI 一起使用【英文标题】:Problem saving data, using CoreData with SwiftUI 【发布时间】:2020-07-21 06:29:55 【问题描述】:我刚开始使用CoreData
和SwiftUI
。
在关注this series of tutorial 之后。
而且我面临着无法按预期保存数据的情况。以下是相关代码:
struct MyView: View
......
@Environment(\.managedObjectContext) var managedObjectContext
func setData()
print(#function)
.....
let myData = SomeEntity(context: self.managedObjectContext)
myData.name = "myName"
myData......
do
try self.managedObjectContext.save()
catch let error
// Handle the Core Data error.
print("Can't save as expected!!!!")
print("Error : \(error)")
.....
var body: some View
........
当这段代码执行时,我得到这个错误:
Can't save as expected!!!!
Error : nilError
谁能告诉我我需要检查什么?
我更感到困惑的是,我的应用程序中有另一个部分(显然相似),在上一层的视图中,保存是完美的。
如果这可能有用,视图会显示如下代码:
).sheet(isPresented: $showingFlag)
MyView(.....)
在呈现视图中,正在保存数据。
【问题讨论】:
检查 managedObjectContext 是否为 nil。在某些情况下,某些视图不是注入 @Environment 变量的同一视图层次结构的一部分;例如模态。 @Magnas managedObjectContext 不为零(我已经检查过了)。但我也注意到 managedObjectContext 在保存不起作用的视图和它起作用的视图中的值不同。不知道这样行不行。 是的,抱歉,刚刚检查了我自己的代码。似乎虽然它不是 nil,但该视图的环境变量并不是您期望的那样。顺便说一句,该视图是模式还是以其他方式在主层次结构之外创建?我通过将 managedObjectContext 作为普通属性传递来解决这个问题。 我刚刚更新了我的帖子,为您提供更多信息。我想这会使视图模态化。 【参考方案1】:表格和警报等是模态视图。模态视图是普通视图,但它们不是界面视图层次结构的一部分,而是显示在屏幕上其余视图的顶部。这意味着它们无法自动访问注入到界面视图层次结构中的相同 @Environment
变量(通常在 SceneDelegate 或更新的 SwiftUI App 生命周期中)。
要访问模态视图中相同的 managedObjectContext 变量,您可以使用标准依赖注入传递它。
).sheet(isPresented: $showingFlag)
MyView(context: managedObjectContext)
struct MyView: View
......
var context: NSManagedObectContext!
func setData()
print(#function)
【讨论】:
是的。这样可行。我想知道在哪种情况下应该直接工作而不必使用这个工作。我想当不使用 .sheet 或 .alert 时?除了非模态视图之外,ios 中似乎很少见。我错了吗? 是的,我也是这么看的。 @Environment 变量对于一个视图到另一个视图的一般流程似乎很好(有点像通过应用程序的旧 viewController 流程),但是当临时发生某些事情时,比如显示模式,该连接不存在。也许随着 SwiftUI 的发展,情况会发生变化,但我不太确定。以上是关于保存数据时出现问题,将 CoreData 与 SwiftUI 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃