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

SwiftUI中@State修饰isSelected属性导致视图无法正常工作的原因咨询

SwiftUI中@State修饰isSelected属性导致视图无法正常工作的原因咨询

嗨,我来帮你把这个问题掰扯明白~

你遇到的这个问题,核心是没搞懂SwiftUI里@State属性包装器的设计初衷和使用场景。

先给你划重点:@State是用来管理视图内部私有、独立的可变状态的,它的生命周期和所属的视图实例绑定,而且这个状态应该是由视图自己来初始化和修改的,外部父视图只在视图第一次创建时能传个初始值,之后外部的更新根本同步不到这个@State变量上。

回到你的代码里看:

  • 你在ElementView里给isSelected加了@State,这就等于告诉SwiftUI:“这个值是我ElementView自己管的,别人别瞎改”。
  • 但实际上,isSelected的真实状态是由父视图TestView的selectedElement决定的——当你点击按钮切换选中状态时,父视图会更新selectedElement,然后试图把新的isSelected值传给ElementView。
  • 可这时候ElementView里的@State var isSelected已经有了自己存储的初始值,它会忽略父视图传过来的新值,自然就不会跟着父视图的状态变化更新UI了,看起来就像“不工作”一样。

而当你去掉@State,把isSelected改成普通的传入属性时:

  • 每次父视图的selectedElement变化,ForEach都会重新计算每个ElementView的isSelected值,然后把最新的值传进去。
  • ElementView会直接使用这个最新的值来更新Text的颜色,所以选中时变红、未选中时变蓝的逻辑就能正常生效了。

再给你提个小建议:以后判断要不要用@State,就看这个状态是不是当前视图自己产生、自己管理的——比如如果ElementView里有个按钮,点击后自己切换选中状态,那这时候用@State才是对的;如果状态是从外部父视图传进来、由外部控制的,就用普通的属性就行,别乱加@State哦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:24:31