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

SwiftUI:ForEach循环内sheet(isPresented)始终打开首个实例求助

SwiftUI 遍历数组弹出对应Sheet错误问题解决

问题描述

我有一个Table对象数组,通过ForEach遍历后将每个Table的名称显示为按钮,点击按钮本该弹出对应Table的编辑Sheet(EditTable)。但实际运行时,按钮标签table.name都正确且唯一,可无论点击哪个按钮,都会打开数组里的第一个Table。我猜测这和循环里复用showSheetTable状态有关,但不知道怎么修正。

原错误代码

@State var tables: [Table]
@State var showSheetTable = false

...    

ForEach(tables) { table in
    VStack {
        Button(table.name) {
            self.showSheetTable.toggle()
        }
        .font(.headline)
        .sheet(isPresented: $showSheetTable) {
            EditTable(table: table)
        }
    }
}              

解决方案

用户jnpdx解决了该问题,核心思路是用可选类型的selectedTable存储选中的对象,通过sheet(item:)绑定这个对象来展示对应Sheet,避免循环中复用同一个布尔状态导致的错误。

正确代码

@State var tables: [Table]
@State var selectedTable: Table? = nil

...    

ForEach(tables) { table in
    VStack {
        Button(table.name) {
            selectedTable = table
        }
        .font(.headline)
    }
}
.sheet(item: $selectedTable) { table in
    EditTable(table: table)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:02:41