SwiftUI 列表,其中包含从核心数据中获取的部分

Posted

技术标签:

【中文标题】SwiftUI 列表,其中包含从核心数据中获取的部分【英文标题】:SwiftUI List with Sections fetched from Core Data 【发布时间】:2020-03-28 19:57:02 【问题描述】:

回到 Objective-c,我可以使用类似这样的方法从 Core Data 中获取对象的分段列表:

self.fetchedResultsController = [[NSFetchedResultsController alloc]
         initWithFetchRequest:fetchRequest
         managedObjectContext:managedObjectContext
           sectionNameKeyPath:@"ispurchased"
                    cacheName:nil];

然后 NSFetchedResultsController 会自动给我分节和行的数据。

我是第一次尝试使用 SwiftUI,我正在尝试弄清楚如何实现这样的分段列表。我发现很多示例使用了一些以分段方式预先构建的固定数组数据,但我不知道如何执行分段 FetchRequest,也不知道如何将其与列表集成。

struct EasyModeList: View 
    @FetchRequest(
        sortDescriptors: [
            NSSortDescriptor(keyPath: \EasyMode.ispurchased, ascending: true),
            NSSortDescriptor(keyPath: \EasyMode.ispurchasable, ascending: false),
            NSSortDescriptor(keyPath: \EasyMode.name, ascending: true),
        ],
        animation: .default)
    var easymodes: FetchedResults<EasyMode>

    @Environment(\.managedObjectContext)
    var viewContext

    var body: some View 
        List 
            ForEach(self.easymodes, id: \.self)  easymode in
                NavigationLink(
                    destination: DetailView(easymode: easymode)
                ) 
                    VStack 
                        Text("\(easymode.name!)")
                    
                
            
        
    

SwiftUI 是否容易支持这些类型的分段列表?我应该将大脑转移到不同的范式吗?

【问题讨论】:

【参考方案1】:

我也在寻找合适的解决方案。现在我将分享我尝试过的内容。我的部分是按字符串标题,但我会根据您的数据对其进行调整。

@FetchRequest(...) var managedEasyModes: FetchedResults<EasyMode>

private var easyModes: [String: [EasyMode]] 
    Dictionary(grouping: managedEasyModes)  easymode in
        easymode.ispurchased ? "Purchased" : "Not Purchased"
    


private var sections: [String] 
    easyModes.keys.sorted(by: >)


var body: some View 
    ForEach(sections, id: \.self)  section in
        Section(header: Text(section)) 
            ForEach(easyModes[section]!)  easyMode in
                NavigationLink(destination: EasyModeView(easyMode: easyMode)) 
                    EasyModeRowView(easyMode: easyMode)
                
            
        
    

【讨论】:

以上是关于SwiftUI 列表,其中包含从核心数据中获取的部分的主要内容,如果未能解决你的问题,请参考以下文章

从核心数据中删除/添加到核心数据后,带有列表的 SwiftUI TabView 不刷新

从公共 API 获取 JSON 以在 SwiftUI 的列表视图中呈现

SwiftUI - 如何限制 ForEach 中显示的对象数量

从核心数据中获取不同的数据以及降序?

从 SwiftUI 列表中的每个元素获取用户输入

如何从 SwiftUI 的详细信息视图(编辑项目视图)中删除核心数据条目?