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

如何在SwiftUI Table中获取选中行的单元格值

在SwiftUI Table中获取选中行的单元格值

你的代码已经通过selection拿到了选中行的UUID(Entrant.ID),只需基于这个ID找到对应的Entrant实例,就能访问该行的所有单元格属性(如Name、Rank等)。下面提供两种简洁的实现方式:


方法1:直接绑定选中的Entrant实例(推荐)

把selection的类型从Entrant.ID?改成Entrant?,让Table直接绑定选中的实体对象,无需手动查找:

修改后的完整代码

import SwiftUI

struct Entrant: Identifiable {
    public let id = UUID()
    public var Flags: String
    public var Name: String
    public var Rank: String
    public var Obs: String
    public var Pl: String
    public var Idle: String
}

private var entrantList = [
    Entrant(Flags: "a",
            Name: "Chavez",
            Rank: "1d",
            Obs: "-",
            Pl: "1",
            Idle: "29m"),
    Entrant(Flags: "a",
            Name: "Chen",
            Rank: "1k",
            Obs: "-",
            Pl: "1",
            Idle: "33m"),
    Entrant(Flags: "a",
            Name: "Clark",
            Rank: "10k",
            Obs: "-",
            Pl: "-",
            Idle: "39m"),
    Entrant(Flags: "a",
            Name: "Clark",
            Rank: "10k",
            Obs: "-",
            Pl: "-",
            Idle: "39m"),
    Entrant(Flags: "a",
            Name: "zxH3",
            Rank: "10k",
            Obs: "-",
            Pl: "-",
            Idle: "39m"),
    Entrant(Flags: "a",
            Name: "pkls3",
            Rank: "10k",
            Obs: "-",
            Pl: "-",
            Idle: "39m"),
    Entrant(Flags: "X",
            Name: "xanadu6291",
            Rank: "5k",
            Obs: "-",
            Pl: "-",
            Idle: "0s"),
]

struct ContentView: View {
            
    @State private var entrants = entrantList
    // 将selection类型改为Entrant?,直接绑定选中实例
    @State private var selection: Entrant? = nil
            
    var body: some View {
        VStack {
            Table(entrants, selection: $selection) {
                TableColumn("Flags",value:\.Flags).width(35)
                TableColumn("Name", value:\.Name).width(80)
                TableColumn("Rank", value:\.Rank).width(30)
                TableColumn("Obs", value:\.Obs).width(30)
                TableColumn("Pl", value:\.Pl).width(20)
                TableColumn("Idle", value:\.Idle).width(30)
            }.frame(width: 350, height: 200)
            
            Button("Push Me!") {
                if let selectedEntrant = selection {
                    // 直接访问选中行的所有属性
                    print("选中名字:\(selectedEntrant.Name)")
                    print("选中等级:\(selectedEntrant.Rank)")
                    print("选中Idle时长:\(selectedEntrant.Idle)")
                } else {
                    print("未选中任何行")
                }
            }
        }
    }
}

方法2:通过ID查找对应的Entrant实例

如果需要保留selection的ID类型(比如做其他逻辑处理),可以用数组的first(where:)方法查找实体:

修改按钮点击事件代码

Button("Push Me!") {
    if let selectedId = selection,
       let selectedEntrant = entrants.first(where: { $0.id == selectedId }) {
        // 访问选中行的属性
        print("选中名字:\(selectedEntrant.Name)")
        print("选中Flags:\(selectedEntrant.Flags)")
    } else {
        print("未选中任何行")
    }
}

注意事项

  • 避免使用强制解包(!),优先用可选绑定(if let)处理空值,防止崩溃。
  • 第一种方法更简洁,适合大多数场景;第二种方法适合需要单独处理ID的业务逻辑。

内容的提问来源于stack exchange,提问作者xanadu6291

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:17:28