我正在尝试为侧边栏视图实现一个 SwiftUI 列表,该列表至少具有 3 种不同类型的数据点:a) 一个固定的枚举列表,b) 一个来自使用 Core Data 的 @FetchRequest 的“标签”列表,c) 一个类似的来自不同@FetchRequest 的“组”列表。
我不知道如何List
在此设置中处理多项选择。用户应该能够从不同的部分中进行选择(我会收到更改通知以微调处理)。我尝试将“选择”类型设为 UUID,并明确设置每个叶视图的 ID,但似乎不起作用(我没有选择突出显示)。
这是我列出的清单:
struct CombinedListView: View {
@FetchRequest(
entity: CJTag.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \CJTag.displayOrder, ascending: true)]
)
var tags: FetchedResults<CJTag>
@FetchRequest(
entity: PrivateGroups.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \PrivateGroups.displayOrder, ascending: true)]
)
var groups: FetchedResults<PrivateGroups>
@State private var selectedItems = Set<UUID>()
var body: some View {
NavigationView {
VStack {
List(selection: $selectedItems) {
// section for Tabs
Section(header: Text("Main Tabs")) {
ForEach(MainTab.allCases, id: \.rawValue) { tab in
Text(tab.rawValue)
.id(tab.id)
}
}
// Section for Tags
if !tags.isEmpty {
Section(header: Text("Tags")) {
ForEach(tags) { tag in
Text(tag.tagName ?? "Tag")
.id(tag.objectID.uriRepresentation().absoluteString) // Directly tag with UUID
.contentShape(Rectangle())
}
}
}
// Section for Groups
if !groups.isEmpty {
Section(header: Text("Groups")) {
ForEach(groups) { group in
Text(group.groupName ?? "Group")
.id(group.objectID.uriRepresentation().absoluteString)
.contentShape(Rectangle())
}
}
}
}
.listStyle(SidebarListStyle())
.navigationTitle("Selectable List")
}
}
}
}
我知道,如果我只有NSManagedObjects
列表,我可以将“选择”类型设置为NSManagedObjectID
,这样它就可以工作了。但我也需要它支持枚举案例列表。
我也尝试过为每一行视图设置tag
(使用与修饰符相同的内容id
),但那也不起作用。我确信这是选择“类型”不匹配的情况,但我找不到实现此目的的最佳设置。
编辑:
为 MainTab 添加代码:
// Enum for Main Tabs
enum MainTab: String, CaseIterable, Identifiable {
case home = "Home"
case favorites = "Favorites"
case settings = "Settings"
case profile = "Profile"
case help = "Help"
var id: String { rawValue }
var iconName: String { rawValue.lowercased() }
}
那么使用枚举怎么样?例如
那么标签可以是:
NavigationView
从旧版本升级到新版本NavigationSplitView
/可能是一个好主意NavigationStack
。它们使用NavigationPath
可以在数组中存储不同类型的类型,这可能会解决您的问题。顺便说一句,
@FetchRequest
如果您实现实体继承,您可以使单个实体返回多个实体,例如获取父实体,然后将返回所有子实体。由于您的
并且
.id(...)
是字符串。它们必须是同一类型才能起作用。因此请更改您的选择以匹配
我建议使用
.tag(...)
而不是.id(...)
。正如我在评论中提到的那样,
NavigationView
不推荐使用NavigationStack
。