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

