macOS SwiftUI Table如何实现单击选中行并获取焦点?
macOS SwiftUI Table 点击行需两次才能选中的问题
我在macOS上使用SwiftUI的Table组件(而非List),期望实现和Cocoa表格一致的交互:用户单击某一行时,表格同时获取焦点并选中该行。但目前遇到的问题是,第一次单击仅能让表格获得焦点,无法选中行,必须再次单击才能完成选中,体验非常糟糕。
最初使用的代码
Table(tableModel.roads, selection: $tableModel.selectedRoadID) { TableColumn("ED") { road in Text(road.district) } .width(35) TableColumn("Road") { road in Text(road.name) } } .frame(height: nil) // 根据需要调整高度
尝试过的无效修改
我曾添加.focused修饰符和设置焦点状态的.onTapGesture,但问题并未解决:
@FocusState private var roadsTableFocused: Bool // ... .focused($roadsTableFocused) .onTapGesture { roadsTableFocused = true }
更新1:问题根源排查
经排查,该问题与我使用的@Observable模型类有关。当同一个View中使用@State变量绑定TextField时功能正常;从非TextField组件切换到表格时也正常。以下是可复现问题的完整示例代码(macOS SwiftUI应用):
ContentView.swift
import AppKit import SwiftUI struct Road: Identifiable { let id: Int let name: String let district: String } @Observable class TableModel { var observableFieldValue: String = "" } struct ContentView: View { @State private var tableModel: TableModel @State private var selectedRoadID: Road.ID? @State private var localFieldValue: String = "" @State private var roads: [Road] = [ Road(id: 1, name: "Market", district: "5"), Road(id: 2, name: "Howard", district: "5"), Road(id: 3, name: "Gough", district: "5"), Road(id: 4, name: "Click Here", district: "5"), ] init() { let viewModel = TableModel() _tableModel = State(wrappedValue: viewModel) } var body: some View { VStack(alignment: .leading, spacing: 8) { TextField("Observable binding", text: $tableModel.observableFieldValue) .textFieldStyle(RoundedBorderTextFieldStyle()) TextField("ContentView binding", text: $localFieldValue) .textFieldStyle(RoundedBorderTextFieldStyle()) Table(roads, selection: $selectedRoadID) { TableColumn("ED") { road in Text(road.district) } .width(35) TableColumn("Road") { road in Text(road.name) } } } .frame(width: 300, height: 220, alignment: .leading) } } #Preview { ContentView() }
更新2:环境信息
我的测试环境为:macOS 15.2(24C101),Xcode 16.2(16C5032a),基于上述代码构建的完整测试应用100%可复现该问题。
真的没人遇到过这个问题吗?🤔
内容的提问来源于stack exchange,提问作者Nick K9
相关产品推荐
相关产品推荐

