【问题标题】:SwiftUI: double-click in Table row on macOSSwiftUI:在 macOS 上的表格行中双击
【发布时间】:2022-02-10 15:33:43
【问题描述】:

我正在使用一个包含多列的表格(SwiftUI 3.0 中的新功能)来显示我的数据,并且我希望能够双击该行以打开一个带有另一个视图的新窗口(通过被双击的行)。实现这一目标的最简单方法是什么?我似乎找不到任何方法来处理双击所选行。

这是我当前显示表格的代码:

      Table(item, selection: $selection, sortOrder: $sorting) {
            TableColumn("RecordName") { itemModel in
                Text("\(itemModel.recordName ?? "no name")")
            }
            TableColumn("Model") { item in
                Text("\(item.deviceName ?? "no model")")
            }
            TableColumn("CreatedAt") { item in
                Text("\(item.deviceCreatedDate?.formatted() ?? "no date")")
            }
      }

如何处理双选操作?另外,如何在另一个“窗口”中打开另一个视图?

【问题讨论】:

标签: swiftui macos-monterey


【解决方案1】:

使用计数为 2 的 onTapGesture 实际上是在处理双击。 这是一个简化的例子。

//
//  ContentView.swift
//  SUITable
//
//  Created by Hezi Shahmoon on 10/02/2022.
//

import SwiftUI

struct ContentView: View {
    @State private var items: [ItemModel] = Array(0...100).map { ItemModel(id: $0, recordName: "item \($0)", age: $0) }
    @State private var selection = Set<ItemModel.ID>()
    @State private var sorting = [KeyPathComparator(\ItemModel.age)]
    
    @State private var showingAlert = false
     
    var body: some View {
        Table(items, selection: $selection, sortOrder: $sorting) {
               TableColumn("RecordName") { itemModel in
                   Text("\(itemModel.recordName)")
                       .onTapGesture(count: 2, perform: {
                           showingAlert = true
                       })
                       .alert("Important message", isPresented: $showingAlert) {
                                   Button("OK", role: .cancel) { }
                       }
               }
         }
    }
}

struct ItemModel: Identifiable {
    var id: Int
    var recordName: String
    var age: Int
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【讨论】:

  • 谢谢,但这只是将“点击”手势放在第一列的文本字段上。如果您有多个列,则必须将其添加到每列中的每个文本字段!这也使选择变得困难。有没有办法将它添加到整个表格行?