【问题标题】:How can I use relationship in ForEach in CoreData using SwiftUI?如何使用 SwiftUI 在 CoreData 中的 ForEach 中使用关系?
【发布时间】:2021-07-21 15:39:29
【问题描述】:

“hackingwithswift”网站已解决问题

只需按照链接上的步骤操作即可! “https://www.hackingwithswift.com/books/ios-swiftui/one-to-many-relationships-with-core-data-swiftui-and-fetchrequest”

原问

我想使用 [relationship]
的元素 但无论我尝试什么,它都不起作用..
有一些东西,我错过了,遗憾的是我直到现在才知道那会是什么:/

首先,我想展示我的核心数据模型和代码。

Core Data Model Image

实体:页面,属性:名称(字符串),关系:toCard
实体:卡片,属性:title(String),price(Double),关系:toPage

场景:页面有多张卡片
一对多(一页对多张卡片)

ContentView.swift 

TabView(selection: self.$pageIndex){
MainPageView()

ForEach(pages, id: \.self) { page in
    SubPageView(whichPage: page)
    }
}
SubPageView.swift

@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Page.entity(),
              sortDescriptors: [NSSortDescriptor(keyPath: \Page.name, ascending: true),
                                NSSortDescriptor(keyPath: \Page.toCard, ascending: true)]
) var pages: FetchedResults<Page>
@FetchRequest(entity: Card.entity(),
              sortDescriptors: [NSSortDescriptor(keyPath: \Card.title, ascending: true),
                                NSSortDescriptor(keyPath: \Card.price, ascending: true)]
) var cards: FetchedResults<Card>

var whichPage: FetchedResults<Page>.Element

ForEach(pages, id: \.self) { page in // page: 1번 2번 3번

    if whichPage == page {
    
        ForEach(Array(whichPage.toCard! as Set), id: \.self) { relationshipFromToCard in

        }
}

问题来了

ForEach(Array(whichPage.toCard! as Set), id: \.self) { item in
    CardView(price: item.price, title: item.title ?? "Unknown")
}

我不能在 CardView 中这样使用。
Xcode 不显示卡片的属性,因为它们不匹配。
我该如何解决它..?

卡的数据已经保存在关系中(代码如下)

let card = Card(context: self.moc)
card.title = self.title
card.price = self.doubleValue
selectedPage?.addToToCard(card)

【问题讨论】:

    标签: ios swift core-data swiftui relationship


    【解决方案1】:

    我在这个很棒的“hackingwithswift”网站的帮助下解决了这个问题!只需按照链接上的步骤操作即可!

    https://www.hackingwithswift.com/books/ios-swiftui/one-to-many-relationships-with-core-data-swiftui-and-fetchrequest

    已编辑:

    1. 转到 .xcdatamodeld 文件

    2. 点击实体 -> 类 -> Codezen 到手动/无

    3. Editor -> 创建 NSManagedObject 子类

    4. 在Page+CoreDataProperties.swift中添加

      public var wrappedName: String {
           name ?? "Unknown Title"
       }
      
       public var cardArray: [Card] {
           let set = toCard as? Set<Card> ?? []
      
           return set.sorted {
               $0.wrappedTitle < $1.wrappedTitle
           }
       }
      
    5. 添加“Card+CoreDataProperties.swift”

      public var wrappedTitle: String {
           title ?? "Unknown Title"
       }
      
       public var wrappedPrice: Double {
           price
       }
      
    6. 现在你可以像这样使用关系的值了!

    ForEach(pages, id: \.self) { page in
        if whichPage == page {
            ForEach(page.cardArray, id: \.self) { card in
                VStack {
                    CardView(price: card.wrappedPrice, title: card.wrappedTitle)
                }
            }
        }
    }
    
    

    【讨论】:

    • 不允许仅链接答案。请在答案中发布相关代码,以便其他人可以从中受益。随着时间的推移,链接会断开
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 2020-07-09
    • 2020-03-03
    • 2020-06-23
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多