SwiftUI中fullScreenCover为何始终显示数组首个索引内容?
SwiftUI ForEach中fullScreenCover显示错误内容的解决方法
问题原因
你在ForEach循环内给每个按钮视图都绑定了同一个布尔状态isFullScreen,点击任意按钮时,所有5个fullScreenCover都会被触发。但SwiftUI只会渲染其中一个(因状态共享导致始终显示索引0的内容),而NavigationLink是每个组件对应独立的目标视图,所以没有这个问题。
解决方案
改用可选类型的状态变量存储选中的索引,使用fullScreenCover(item:)的重载版本,通过可选值的变化来触发对应内容的全屏视图。
修改后的代码
struct TestView: View { // 用可选Int存储选中的索引,默认nil表示未选中 @State private var selectedNumber: Int? var body: some View { VStack { ForEach(0..<5, id: \.self) { number in Text("\(number)") .background(.red) .foregroundColor(.white) .padding(20) .onTapGesture { // 点击时设置选中的索引 selectedNumber = number } } } // 使用item绑定可选值,当selectedNumber不为nil时触发全屏视图 .fullScreenCover(item: $selectedNumber) { selectedNum in Test2View(title: selectedNum) } } } // 遵循Swift命名规范:结构体首字母大写 struct Test2View: View { var title: Int var body: some View { Text("\(title)") } } // 为Int添加Identifiable协议扩展,满足fullScreenCover(item:)的要求 extension Int: Identifiable { public var id: Int { self } }
说明
selectedNumber作为可选状态,点击按钮时赋值为对应的索引,触发全屏视图;关闭全屏视图时,该值会自动重置为nil。- 扩展
Int实现Identifiable协议,是因为fullScreenCover(item:)要求绑定的类型必须遵循Identifiable,这样SwiftUI才能区分不同的触发源。
内容的提问来源于stack exchange,提问作者Luka Šalipur
相关产品推荐
相关产品推荐

