Swiftui @状态变量未按预期更新视图

Swiftui @状态变量未按预期更新视图,swiftui,Swiftui,我在下面的视图中实例化了一行按钮,我想让它们可以选择(一次只能选择一个) 选择一个时,它周围应显示一个蓝色圆圈。这是上面引用的my UserSelectionIcon对象中应该执行此操作的行 //@State var selected: Bool = false Circle() .strokeBorder(selected ? Color.blue.opacity(0.7) : Color.clear, lineWidth: 2) 当选择第一个索引并显示蓝色圆圈时,该行不起作用。

我在下面的视图中实例化了一行按钮,我想让它们可以选择(一次只能选择一个)

选择一个时,它周围应显示一个蓝色圆圈。这是上面引用的my UserSelectionIcon对象中应该执行此操作的行

//@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)