我有一个包含几行的列表。
这些线条包含两个可点击的图像和一些文本。
单击或双击图像将触发操作。
单击该行中的任何其他位置将选择列表中的该行。
双击该行中的任何其他位置将触发一个操作。
以下代码可以在 iOS 中运行,要做什么,它可以在 MacOS 中运行。
在 MacOS (13.4.1 (c) (22F770820d)) 中,我的效果是,通过单击选择行无法正常工作。
struct Line_List: View {
@State private var selectedRow: Int? = nil
var body: some View {
List(1..<11, id: \.self, selection: $selectedRow) { index in
Line(index: index)
}
}
}
struct Line: View {
var index: Int
var body: some View {
HStack (alignment: .top) {
Image(systemName: "1.circle.fill")
.onTapGesture (count: 2){
print("Icon 1 Double-Clicked")
}
.onTapGesture (count: 1){
print("Icon 1 Single-Clicked")
}
VStack (alignment: .leading){
Text("Line: \(index)")
Text("Some other Text")
}
Spacer()
Image(systemName: "2.circle.fill")
.onTapGesture (count: 2){
print("Icon2 Double-Clicked")
}
.onTapGesture (count: 1){
print("Icon2 Single-Clicked")
}
}
.background(Color.green)
.onTapGesture(count: 2) { // does not work in MacOS
print("Line Double-Clicked")
}
}
}
适合我选择行的解决方法是将选择作为绑定传递到行视图,并添加单个 onTapGesture 以将选择绑定更改为索引值。我确信这与拾取 TapGesture 的层有关。将两者都放在背景颜色上可以让它确定单击还是双击。
struct Line: View {
var index: Int
@Binding var selectedRow: Int? // <- Adding a binding to the selection
var body: some View {
HStack (alignment: .top) {
Image(systemName: "1.circle.fill")
.onTapGesture (count: 2){
print("Icon 1 Double-Clicked")
}
.onTapGesture (count: 1){
print("Icon 1 Single-Clicked")
}
VStack (alignment: .leading){
Text("Line: \(index)")
Text("Some other Text")
}
Spacer()
Image(systemName: "2.circle.fill")
.onTapGesture (count: 2){
print("Icon2 Double-Clicked")
}
.onTapGesture (count: 1){
print("Icon2 Single-Clicked")
}
}
.background(Color.green)
.onTapGesture(count: 2) { // does not work in MacOS
print("Line \(index.description) Double-Clicked")
}
.onTapGesture(count: 1) { // <- Add This
selectedRow = index
print("Selected Line is \(index.description)")
}
}
}