Swiftui @状态变量未按预期更新视图
我在下面的视图中实例化了一行按钮,我想让它们可以选择(一次只能选择一个) 选择一个时,它周围应显示一个蓝色圆圈。这是上面引用的my UserSelectionIcon对象中应该执行此操作的行Swiftui @状态变量未按预期更新视图,swiftui,Swiftui,我在下面的视图中实例化了一行按钮,我想让它们可以选择(一次只能选择一个) 选择一个时,它周围应显示一个蓝色圆圈。这是上面引用的my UserSelectionIcon对象中应该执行此操作的行 //@State var selected: Bool = false Circle() .strokeBorder(selected ? Color.blue.opacity(0.7) : Color.clear, lineWidth: 2) 当选择第一个索引并显示蓝色圆圈时,该行不起作用。
//@State var selected: Bool = false
Circle()
.strokeBorder(selected ? Color.blue.opacity(0.7) : Color.clear, lineWidth: 2)
当选择第一个索引并显示蓝色圆圈时,该行不起作用。但是,单击任何按钮都不会显示其周围的蓝色圆圈。正在按预期更新currentSelectedIndex变量。在
用户选择图标中,您必须使用绑定来访问currentSelectedIndex
,而不是状态
,因为如果在另一个视图中更改值,状态
将不会更新
因此,您必须在UserSelectionIcon
视图中将Bool
“selected”安全设置为Binding
。更改此项:
@State var selected: Bool = false
为此:
@Binding var selected: Bool
而不仅仅是重构这个调用:
UserSelectionIcon(room: rooms[roomIndex], selected: roomIndex == currentSelectedIndex)
对于这一点:
UserSelectionIcon(room: rooms[roomIndex], selected: Binding(get: { roomIndex == currentSelectedIndex }, set: {_,_ in }))
现在将两个索引的比较包装到一个绑定中,该绑定将始终表示两个索引的最新比较。如果只是传递比较,那么它就像一个一次性值,如果其中一个索引被更新,它不会刷新结果。但是现在,在选择笔划边框的颜色时,每次访问绑定时都会重新评估比较
替代解决方案:
您应该重构以下内容:
UserSelectionIcon(room: rooms[roomIndex], selected: roomIndex == currentSelectedIndex)
为此(要传递状态
变量):
在UserSelectionIcon
中,您应该重构这一行:
@State var selected: Bool = false
致:
每个图标都应该保存自己的索引,以便以后比较:
var roomIndex: Int
然后,可以在显示边框时比较这两个索引
.strokeBorder(currentSelectedIndex == roomIndex ? Color.blue.opacity(0.7) : Color.clear, lineWidth: 2)
您的ForEach
是在列表中还是在滚动视图中?它在滚动视图中我使用完整视图编辑文章我尝试使用自定义绑定,因为我想避免将所选索引的上下文传递给子视图,因为我希望它只是一个有一张图片和一个圆圈的愚蠢的视图,没有太多其他的东西,但我没有这样做,我刚刚决定使用你的第一个解决方案(当然有效!!)谢谢you@JoeyHanlon不客气。我将看一看定制绑定,也许我可以实现一个工作解决方案。绑定对我来说很奇怪,因为我并不真正需要它的“set”部分case@JoeyHanlon没错,基本上不需要绑定的“set”部分。我更新了我的答案来说明它是如何工作的
@Binding var currentSelectedIndex: Bool
var roomIndex: Int
.strokeBorder(currentSelectedIndex == roomIndex ? Color.blue.opacity(0.7) : Color.clear, lineWidth: 2)