You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:17:42