【问题标题】:How/Where to assign CoreData entity's variable to structs's @State variable in SwiftUI?如何/在何处将核心数据实体变量分配给 SwiftUI 中的结构 @State 变量?
【发布时间】:2020-11-28 20:42:28
【问题描述】:

我使用@State 变量(title, description) 与另一个视图(UITextView)进行通信。该视图有一个绑定字符串变量(text)

我想使用特定的 CoreData 实体 (Item) 来更新我的 @State 变量,因此 UITextView 中的文本会在视图出现时更新(因此 UITextView 不会出现空白)。据我了解,我首先应该以某种方式将该 CoreData 实体变量分配给我的 @State 变量,并且当我从 UITextView 对我的 @State 变量进行更新时,我应该将上下文保存到我的 CoreData 实体中。我使用 init() 进行初始分配,并且在进行实时预览调试之前不会出现任何错误。我收到此错误(作为调试器消息):

调用 NSManagedObject 类 'Item' 上的指定初始化程序失败

此外,预览中缺少文本。

也许还有其他方法可以做我想做的事?

这是我的代码:

主视图

struct DetailView: View {
    @ObservedObject var item: Item = Item()
    @State private var title = ""
    @State private var description = ""
    init (item: Note)
    {
        self.item = item
        self.title = item.title!
...
 TextView(text: self.$title...
...
TextView(text: self.$details...
...

文本视图

struct TextView: UIViewRepresentable {
    @Binding var text: String
...
func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
...

附:当我直接在CoreData实体的属性(例如self.item.title)中直接传递(忽略我的@State变量的存在)作为UITextView显示文本的参数实际上有效但我不知道如何将更改从UITextView保存到CoreData实体直接

【问题讨论】:

  • 不要调用 Item(),因为您在 init 方法中注入了一个实例

标签: swift core-data swiftui ios13


【解决方案1】:

有几种方法可以做到这一点。

@FetchedRequest 方式有很多教程。

https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-fetchrequest-property-wrapper

使用该方法,您将传递您正在编辑的 users 对象。

另外,您可以使用FetchedResultsController

https://www.youtube.com/watch?v=-U-4Zon6dbE

这样您就可以拥有一个带有CoreData 对象的@ObservableObject

https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller

ManagedObjectCoreData 对象已经符合 ObservableObject https://developer.apple.com/documentation/coredata/nsmanagedobject

你不需要把它放在@State 中,你只需要从 CoreData 传递 Fetched Object。

另外,当用户使用完对象后,您需要savemanagedObjectContext

【讨论】:

  • 抱歉,我可以获取(使用@FetchRequest)与我提供观察项变量完全相同的 Item() 吗?
  • 我的代码实际上看起来像这样:用户在 ContentView。我将此选定的项目发送回 ContentView(使用 @State@Binding)。然后我将该项目作为变量 (self.selectedItem) 发送到 DetailView。在我的 DetailView 中是 @ObservedObject item。我想我在某个地方错过了逻辑
  • 您不需要额外的StateBinding。只需使用 CoreData 对象。查看 SwiftUI 教程 - 处理用户输入。只需将教程中的UserData object 替换为您想要/拥有的CoreData ObjectFetched。在LandmarkList 中以您的FetchedResult 开头。
  • 另外,如果您想要一个无法获取的新 CoreData 对象,您必须创建它。 Item()。查看创建和保存托管对象下的 CoreData 编程指南。developer.apple.com/library/archive/documentation/Cocoa/…
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 2014-08-20
  • 2019-11-10
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多