代码之家  ›  专栏  ›  技术社区  ›  Clifton Labrum

访问嵌套SwiftUI列表中的核心数据子对象

  •  0
  • Clifton Labrum  · 技术社区  · 5 年前

    我的最终目标是创建一个快捷界面 List 和孩子们在一起。我有包含项目(子项目)的部分(父项目),这些部分将展开和折叠项目列表。

    我用一个 NSOutlineView 使用Realm,但现在我正试图用SwiftUI和核心数据构建它。 *GULP* : )

    enter image description here

    我对核心数据不是很有经验,但我认为我的数据设置正确。我有一个 Section 实体和a Project 实体,以及 部分 有一个 projects 具有多对多关系的属性。

    enter image description here

    因此,我推测(错误如下所示) section.projects 是一个 项目 物体。

    为了简单起见,我只是尝试在一个 列表 (我会担心天气的 DisclosureGroup (待会儿再说)

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

    上面标记的行有两个错误,这似乎表明我没有一个对象数组来处理 部分项目 :

    在“ForEach”上引用初始值设定项“init(u:id:content:)”需要“NSObject”符合“RandomAccessCollection”

    可选类型“SensorDeredSet”的值必须将其展开为“SensorDeredSet”类型的值

    如果 部分项目 是一个 NSOrderedSet 为什么我不能重复一遍呢?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Clifton Labrum    5 年前

    在这篇文章的帮助下,我发现了这一点: https://www.hackingwithswift.com/books/ios-swiftui/one-to-many-relationships-with-core-data-swiftui-and-fetchrequest

    我不得不改变我的核心数据实体,以使其 科德根 布景 Manual/None (在 .xcdatamodeld Xcode中的编辑器)。然后我选择我的实体并转到 编辑>创建NSManagedObject子类。。。 它创建了一系列反映我的核心数据模型的文件。

    然后在 节+CoreDataProperties。敏捷的 文件中,我添加了一个计算属性,以便访问我的项目(按名称排序):

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

    然后,为了方便起见,在里面 Project+CoreDataProperties。敏捷的 我补充说:

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

    ...这允许我的computed属性按名称对项目进行排序(因为核心数据默认情况下将字符串视为可选项)。

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

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