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

SwiftUI中Sheet绑定双按钮始终显示错误视图的问题求助

问题根源
  • 你把.sheet修饰符绑定到了List的每一行(HStack)上,导致列表生成了20个独立的Sheet实例。当activeSheet状态变更时,所有Sheet都会尝试触发渲染,而界面最终只会展示最后一个Sheet实例,因此无论点击哪个按钮,最终显示的都是最后一行对应的Sheet内容。
  • ActiveSheet的id使用hashValue存在隐患:hashValue并非稳定值,可能在不同运行环境下变化,不符合Identifiable协议对ID唯一性、稳定性的要求。
修复代码
enum ActiveSheet: Int, Identifiable {
    case first = 1, second = 2
    
    var id: Int { rawValue }
}

struct ContentView: View {
    @State var activeSheet: ActiveSheet?
    
    var body: some View {
        NavigationView {
            List(0..<20) { item in
                HStack {
                    Text("Item Row: \(item)")
                    Spacer()
                    Button("#1") {
                        activeSheet = .first
                    }
                    Spacer()
                    Button("#2") {
                        activeSheet = .second
                    }
                }
            }
            // 将Sheet移到List外部,确保整个视图仅存在一个Sheet实例
            .sheet(item: $activeSheet) { item in
                switch item {
                case .first: View1()
                case .second: View2()
                }
            }
        }
    }
}

struct View1: View {
    var body: some View {
        Text("View1")
            .foregroundColor(.secondary)
    }
}

struct View2: View {
    var body: some View {
        Text("View2")
            .foregroundColor(.secondary)
    }
}
核心修改说明
  • 调整Sheet位置:把.sheet从列表行元素移到List本身,让整个ContentView只维护一个Sheet实例,状态变更时只会触发这一个Sheet的内容切换。
  • 优化ID实现:将ActiveSheet改为带原始值的枚举,用rawValue作为id,保证ID的稳定性和唯一性,避免因hashValue不稳定导致的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:05:59