SwiftUI跨窗口共享选中状态时表格数据消失问题求助
问题排查与解决方案
核心问题1:DataSource 实例被意外重建
你在 ContentView 中使用 @ObservedObject var dataSource = DataSource(),这会导致每当 ContentView 因状态变化(比如 testData 的 anOpponentName 更新)重新渲染时,dataSource 会被重新实例化,之前从网络获取的表格数据会丢失,直接表现为表格内容消失。
修复方案
把 ContentView 中的 @ObservedObject 改为 @StateObject,确保 DataSource 实例在 ContentView 生命周期内保持唯一:
struct ContentView: View { // 替换 @ObservedObject 为 @StateObject @StateObject var dataSource = DataSource() @ObservedObject var testData: ShareValues var body: some View { // 原有代码不变 } }
核心问题2:按钮操作未关联正确的 DataSource 实例
你在按钮点击时每次都会创建新的 ButtonsFuncs 实例:ButtonsFuncs().connectButton(),如果 connectButton() 方法需要操作 dataSource 的数据,当前实现无法将网络获取的数据更新到 ContentView 持有的 dataSource 实例中,会导致数据不同步,甚至触发意外的实例重建。
修复方案
修改 ButtonsFuncs,让它接收 DataSource 作为参数,确保操作的是同一个实例:
// 调整 ButtonsFuncs 结构,传入目标 dataSource class ButtonsFuncs { func connectButton(dataSource: DataSource) { // 在这里执行网络请求,并更新 dataSource.tableData // 示例: // dataSource.tableData = 从网络获取的 Entrant 数组 } func disconnectButton(dataSource: DataSource) { // 断开连接的逻辑,比如清空数据 // dataSource.tableData.removeAll() } }
然后在 ContentView 的按钮点击中传入当前的 dataSource:
Button("Connect") { ButtonsFuncs().connectButton(dataSource: dataSource) } Button("DisConnect") { ButtonsFuncs().disconnectButton(dataSource: dataSource) }
额外优化建议
- 统一属性命名风格:Swift 推荐属性名使用小驼峰命名(比如
flags而非Flags),保持代码风格一致性:
struct Entrant: Identifiable { let id = UUID() var flags: String var name: String var rank: String var obs: String var pl: String var idle: String }
对应的表格列路径也要同步修改:
TableColumn("Flags", value: \Entrant.flags).width(35) // 其他列同理修改
- 确保
DataSource正确发布数据更新:DataSource必须遵循ObservableObject,并且tableData标记为@Published,这样数据变化时才能通知 SwiftUI 更新视图:
class DataSource: ObservableObject { @Published var tableData: [Entrant] = [] // 其他业务逻辑 }
内容的提问来源于stack exchange,提问作者xanadu6291
相关产品推荐
相关产品推荐

