如何在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
相关产品推荐
相关产品推荐

