【问题标题】:Accessing Core Data Child Objects in Nested SwiftUI List在嵌套的 SwiftUI 列表中访问核心数据子对象
【发布时间】:2021-02-08 22:13:38
【问题描述】:

我的最终目标是创建一个带有孩子的 SwiftUI List。我有包含项目(子项)的部分(父项),这些部分将展开和折叠其项目列表。

我使用 Realm 使用 NSOutlineView 构建了它,但现在我尝试使用 SwiftUI 和 Core Data 构建它。 *GULP* :)

我对 Core Data 不是很有经验,但我认为我的数据设置正确。我有一个Section 实体和一个Project 实体,而Section 有一个具有一对多关系的projects 属性。

所以,我假设(错误地如下图所示)section.projects 是Project 对象的集合。

为简单起见,我只是想在List 中嵌套这两个(稍后我会担心DisclosureGroup 的东西):

List{
  ForEach(sections, id: \.recordName){ section in
    Text(section.name)
    ForEach(section.projects, id: \.recordName){ project in //<-- ERROR
      Text(project.name)
    }
  }
}

上面标记的行有两个错误,似乎表明我在section.projects 中没有要使用的对象数组:

在“ForEach”上引用初始化程序“init(_:id:content:)”要求“NSObject”符合“RandomAccessCollection”

可选类型 'NSOrderedSet?' 的值必须解包为“NSOrderedSet”类型的值

如果section.projects 是NSOrderedSet,为什么我不能迭代它?

【问题讨论】:

    标签: core-data swiftui


    【解决方案1】:

    我在这篇文章的帮助下解决了这个问题:https://www.hackingwithswift.com/books/ios-swiftui/one-to-many-relationships-with-core-data-swiftui-and-fetchrequest

    我必须更改我的核心数据实体,使其 Codegen 设置为 Manual/None(在 Xcode 中的 .xcdatamodeld 编辑器中)。然后我选择我的实体并转到 Editor > Create NSManagedObject Subclass...,它创建了一堆反映我的核心数据模型的文件。

    然后在 Section+CoreDataProperties.swift 文件中,我添加了一个计算属性以允许我访问我的项目(按名称排序):

    public var projectArray: [Project] {
      let set = projects as? Set<Project> ?? []
      return set.sorted {
        $0.wrappedName < $1.wrappedName
      }
    }
    

    然后,为方便起见,在 Project+CoreDataProperties.swift 中添加了以下内容:

    public var wrappedName: String{
      name ?? "Unknown Name"
    }
    

    ...它允许我的计算属性按名称对我的项目进行排序(因为 Core Data 默认将字符串视为可选项)。

    因此,我能够像这样迭代我的嵌套数据:

    ForEach(sections, id: \.self) { section in
      Text(section.wrappedName)
            
      ForEach(section.projectArray, id: \.self) { project in
        Text(project.wrappedName)
      }
    }
    

    【讨论】:

    • Clifton 值得一提,顺便说一句,为简单起见,您可能喜欢使用 Codegen = Class Definition,而不是手动准备您的 NSManagedObject 子类,而是为您需要计算的每个核心数据实体编写一个扩展属性(例如 extension Project { ... } 为您的 wrappedName 计算 var)。
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多