import SwiftUI
struct ContentView: View {
@State private var items: [ItemModel] = Array(0...100).map { ItemModel(id: $0, title: "item ($0)", age: $0) }
@State private var selection = Set<ItemModel.ID>()
@State private var sorting = [KeyPathComparator(ItemModel.age)]
var body: some View {
Table(items, selection: $selection, sortOrder: $sorting) {
TableColumn("id", value: .id) { Text("($0.id)") }
TableColumn("title", value: .title)
TableColumn("age", value: .age) { Text("($0.age)") }
}
.onChange(of: sorting) {
items.sort(using: $0)
}
.font(.caption)
.frame(width: 960, height: 540)
}
}
struct ItemModel: Identifiable {
var id: Int
var title: String
var age: Int
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
this is a working example of a Table sorted on Model.age, and support multi selection,
I want single selection and open sheet on double click on a row, is that possible?
also how do I get the selected item object?
thank you 🙏
3
Answers
You must change
Set<Value.ID>
forValue.ID
for only one row selection, and makeTapGesture
in Text.Like Adam comments, the other answer has a number of problems with the selection region and response time.
You do have to set var selection as
ItemModel.ID?
but you also have to handle click actions differently.It’s important to note that this will only work from Big Sur on.
The way I handle different actions for single and double clicks is this:
For your example:
If you want to allow single and double click in the entire row, you need to have the TableColumn content fill the entire width of the column and apply the modifiers on the rest of the TableColumn contents.
Regarding the double click of a table row: Apple introduced a new context menu modifier contextMenu(forSelectionType:menu:primaryAction:) with SwiftUI 4 at WWDC 2022. With this, a
primaryAction
can be provided that is performed when the user double clicks on aTable
row.