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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:25:25