【发布时间】:2021-01-20 15:06:12
【问题描述】:
TL;DR:
我无法在 macOS 上拥有包含详细视图和多项选择的列表。
更详细:
为了演示我的问题,我制作了一个小示例项目。 UI 如下所示:
这是启动时的“应用程序”,顶部有一个列表,下面有一个详细表示。因为我使用的是列表的初始化程序init(_:selection:rowContent:),其中selection 根据Apple 的文档是Binding<SelectionValue?>? 类型,所以我可以免费使用键盘箭头键选择项目。
这是完整的代码:
import SwiftUI
@main
struct UseCurorsInLisstApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(ViewModel())
}
}
}
class ViewModel: ObservableObject {
@Published var items = [Item(), Item(), Item(), Item(), Item()]
@Published var selectedItem: Item? = nil
}
struct Item: Identifiable, Hashable {
let id = UUID()
}
struct ContentView: View {
@EnvironmentObject var vm: ViewModel
var body: some View {
VStack {
List(vm.items, id: \.self, selection: $vm.selectedItem) { item in
VStack {
Text("Item \(item.id.uuidString)")
Divider()
}
}
Divider()
Group {
if let item = vm.selectedItem {
Text("Detail item \(item.id.uuidString)")
} else {
Text("No selection…")
}
}
.frame(minHeight: 200.0, maxHeight: .infinity)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
现在,到目前为止,在这方面取得了成功,我认为能够选择多行会很有用,所以我仔细研究了List(_:selection:rowContent:),其中selection 的类型为Binding<Set<SelectionValue>>?。为了能够获得详细视图,我只是对
ViewModel:
class ViewModel: ObservableObject {
@Published var items = [Item(), Item(), Item(), Item(), Item()]
@Published var selectedItem: Item? = nil
@Published var selectedItems: Set<Item>? = nil {
didSet {
if selectedItems?.count == 1, let item = selectedItems?.first {
selectedItem = item
}
}
}
}
还有ContentView:
struct ContentView: View {
@EnvironmentObject var vm: ViewModel
var body: some View {
VStack {
List(vm.items, id: \.self, selection: $vm.selectedItems) { item in
VStack {
Text("Item \(item.id.uuidString)")
Divider()
}
}
Divider()
Group {
if vm.selectedItems?.count == 1, let item = vm.selectedItems?.first {
Text("Detail item \(item.id.uuidString)")
} else {
Text("No or multiple selection…")
}
}
.frame(minHeight: 200.0, maxHeight: .infinity)
}
}
}
现在的问题是我无法再选择行中的项目,无论是通过单击还是通过箭头键。这是我遇到的限制还是我“持有错误”?
【问题讨论】:
标签: macos swiftui swiftui-list