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

SwiftUI中show/hide按钮无法隐藏文本,@State变量疑似配置错误

SwiftUI Show/Hide按钮无法隐藏文本的问题修复

问题根源

你代码里的核心问题有两个:

  1. @State变量的位置错误:把@State var meON: Bool = true放在了ForEach内部的if let代码块里。SwiftUI要求@State必须定义在View结构体的顶层属性中,不能放在body的闭包逻辑里。每次视图刷新(比如点击append按钮、触发状态变更),这个局部的meON都会被重新初始化为true,导致点击toggle后立刻被重置,文本永远显示。
  2. 多余的索引查找:ForEach已经直接遍历数组元素了,没必要再通过firstIndex去查找当前元素的索引,这步完全多余,还会增加不必要的计算。

修复方案

因为每个列表项需要独立的显示状态,我们需要给每个列表项创建一个独立的子View,让子View自己管理显示状态。这样每个项的状态不会互相干扰,也不会在父视图刷新时被重置。

完整修复代码

import SwiftUI

@main
struct dsfApp: App {
    @StateObject var guideLinesArrayGlobal = GuideLinesArrayObservedMainClass()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(guideLinesArrayGlobal)
        }
    }
}

struct Fruits: Identifiable {
    var id: UUID = UUID()
    var text: String = ""
}

final class GuideLinesArrayObservedMainClass: ObservableObject {
    @Published var guideLinesArray: [Fruits] = []
}

// 新增子View,管理单个水果项的显示状态
struct FruitItemView: View {
    let fruit: Fruits
    @State private var isShowing = true // 每个子View独立持有状态
    
    var body: some View {
        HStack {
            Button("show/hide") {
                isShowing.toggle()
            }
            if isShowing {
                Text(fruit.text)
            }
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var guideLinesArrayLocal: GuideLinesArrayObservedMainClass
    
    var body: some View {
        VStack {
            Button("append") {
                // Fruits的id默认是UUID(),不需要手动传
                guideLinesArrayLocal.guideLinesArray.append(Fruits(text: "apple"))
                guideLinesArrayLocal.guideLinesArray.append(Fruits(text: "orange"))
                guideLinesArrayLocal.guideLinesArray.append(Fruits(text: "peach"))
            }
            .padding()
            
            // 用List或者ForEach都可以,这里用List更符合SwiftUI列表样式
            List(guideLinesArrayLocal.guideLinesArray) { fruit in
                FruitItemView(fruit: fruit)
            }
        }
    }
}

关键说明

  • 子View管理独立状态:每个FruitItemView都有自己的@State private var isShowing,这样点击单个项的按钮只会影响当前项的显示状态,不会波及其他项。
  • @State的正确位置:@State变量必须定义在View结构体的顶层,这样SwiftUI才能正确跟踪状态变化,不会在视图刷新时重置状态。
  • 简化代码:去掉了多余的索引查找逻辑,直接通过List遍历数组元素,代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:54:52