[英]SwiftUI 3 MacOs Table single selection and double click open sheet
[英]SwiftUI macOS List with double click, selection is not working well
在 macOS 上的SwiftUI
中實現List
時,似乎雙擊 TapGesture 會弄亂選擇。 我可以選擇文本的“外部”,但單擊文本不起作用。 注釋掉 TapGesture 時,選擇再次起作用。
struct Item: Identifiable, Hashable {
var id: String { name }
let name: String
}
class Manager: ObservableObject {
@Published var data = [Item]()
@Published var selection = Set<Item>()
init() {
data = [
.init(name: "TextTextTextTextTextTextTextText-A"),
.init(name: "TextTextTextTextTextTextTextText-B"),
.init(name: "TextTextTextTextTextTextTextText-C"),
.init(name: "TextTextTextTextTextTextTextText-D"),
.init(name: "TextTextTextTextTextTextTextText-E")
]
}
}
struct ContentView: View {
@ObservedObject var manager = Manager()
@State var selection = Set<Item>()
var body: some View {
List(manager.data, id: \.self, selection: $selection) { item in
Text(item.name)
.gesture(TapGesture(count: 2).onEnded {
print("Double clicked", item.name)
})
}
.padding()
}
}
一種可能的解決方法是使用simultaneousGesture
,但是以這種方式設置選擇selection = Set([item])
感覺很尷尬。
List(manager.data, id: \.self, selection: $selection) { item in
Text(item.name)
.gesture(TapGesture(count: 2).onEnded {
print("Double clicked", item.name)
})
.simultaneousGesture(TapGesture().onEnded {
selection = Set([item])
})
}
還值得注意的是,如果selection
不是Set<Item>
而是Set<String>
(意味着data
本身不是Item
,而是String
),則選擇運行良好。
似乎 .gesture 消耗了用戶的操作。 可能你需要更多的選擇邏輯。
struct ContentView: View {
@StateObject var manager = Manager()
var body: some View {
List(manager.data, id: \.self, selection: $manager.selection) { item in
Text(item.name)
.gesture(
TapGesture(count:1)
.onEnded({
print("Selected: \(item.name)")
manager.selection.removeAll()
manager.selection.insert(item)
})
)
.highPriorityGesture(
TapGesture(count:2)
.onEnded({
print("Double clicked: \(item.name)")
})
)
}
.padding()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.