簡體   English   中英

SwiftUI macOS列表雙擊,選擇效果不佳

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM