我一直在尝试使用SwiftUI进行实验,但似乎找不到有关如何使用SwiftUI创建多列TableView
(就像NSTableView
)的任何信息。我找到的所有示例都显示单列数据。
Apple的文档甚至指定SwiftUI List
结构用于展示单列数据行。这是MacOS应用程序中非常基本的数据结构,但似乎没有任何提及!
有人能解释一下吗?我猜它可能还没有准备好,但仍然想知道。
在macOS Monterey中,NSTableView
现在可以用Table
包装。此外,Table
还支持带有关键路径和尾随闭包的TableColumn
。
struct ContentView: View {
@State private var characters = StoryCharacter.previewData
var body: some View {
Table(characters) {
TableColumn("") { CharacterIcon($0) }
.width(20)
TableColumn("Villain") { Text($0.isVillain ? "Villain" : "Hero") }
.width(40)
TableColumn("Name", value: \.name)
TableColumn("Powers", value: \.powers)
}
}
}
Table
是一个容器,用于呈现按行排列的数据,可以提供选择其成员并按升序或降序排序的功能。每个TableColumn
结构在表格中显示每一行的视图。
以下是一段代码示例:
import SwiftUI
struct Item: Identifiable {
var id: Int
var item: String
var qty: String
}
struct ContentView: View {
@State var sorting = [KeyPathComparator(\Item.qty)]
@State var selecting: Int?
@State var items: [Item] = [1,2,3,4,5].map {
Item(id: $0, item: "item \($0)", qty: "qty " + String($0))
}
var body: some View {
VStack {
Table(items, selection: $selecting, sortOrder: $sorting) {
TableColumn("##", value: \.id) { entity in
Text("\(entity.id)").font(.title2)
}
TableColumn("What", value: \.item) { entity in
Text(entity.item).font(.title2)
}
TableColumn("Qty", value: \.qty) { entity in
Text("\(entity.qty)").font(.title2)
}
}.frame(width: 900, height: 210)
.onChange(of: sorting) { items.sort(using: $0) }
.font(.title)
}
}
}
List {
HStack {
VStack {
//Column 1 Data
}
}
Divider()
VStack {
//Column 2 Data
}
}
然后,只需重复此操作,直到需要的数据列数。
struct StaffList: View {
private var data = [Data]()
var body: some View {
List {
HStack() {
VStack {
//Column 1 Data
Text("Name")
.foregroundColor(.primary)
.font(.headline)
Divider()
ForEach(data) { person in
// Text(person.name) this is list ...
}
}
Divider()
VStack {
//Column 2 Data
Text("Creation Date")
.foregroundColor(.primary)
.font(.headline)
Divider()
ForEach(data) { person in
// Text(person.name) this is list ...
}
}
}
}
}
}
NSViewRepresentable
。你有任何新的信息吗? - LupurusNSTableView
的方法吗? - Lupurus