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 的列表视图中呈现