提问人:mica 提问时间:8/20/2023 最后编辑:mica 更新时间:8/21/2023 访问量:48
在 MacOS 上的 SwiftUI 中,检测列表中的点击和双击
In SwiftUI on MacOS Detect Clicks and Doubleclicks in List
问:
我有一个有几行的列表。
线条包含两个可单击的图像和一些文本。
单击或双击图像将触发操作。
单击“行”中的其他任何位置将选择“列表中的行”。
双击行中的其他任何位置将触发操作。
以下代码适用于 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")
}
}
}
答:
0赞
Hongtron
8/21/2023
#1
适合我选择行的解决方法是将所选内容作为绑定传递给 Line 视图,并添加单个 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)")
}
}
}
评论