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

