我正在尝试创建一个ButtonStyle
响应状态变化的自定义。我无法让它在状态改变时更新。
以下是简化版本:
struct TestButton: ButtonStyle {
@State var selected: Bool = true
func makeBody(configuration: ButtonStyleConfiguration) -> some View {
configuration.label
.frame(width: 48)
.padding(EdgeInsets(top: 3, leading: 4, bottom: 3, trailing: 4))
.background(selected ? .green : .red)
.cornerRadius(14)
}
}
struct TestView: View {
@AppStorage("test") var test = 1
var body: some View {
HStack {
Button(test == 1 ? "Yes" : "No") { test = 1 }
.buttonStyle(TestButton(selected: test == 1))
Button(test == 2 ? "Yes" : "No") { test = 2 }
.buttonStyle(TestButton(selected: test == 2))
Button(test == 3 ? "Yes" : "No") { test = 3 }
.buttonStyle(TestButton(selected: test == 3))
}
// .id(UUID()) // trying to avoid this
.padding()
}
}
该变量test
由按钮设置,我希望它改变按钮的外观。test == …
当文本在Yes
和之间切换时,测试正常运行No
。但是,当我将它与selected
参数一起使用时,它不会改变任何东西。它在视图首次加载时设置值,但不会更新。
视图中的变量使用@AppStorage
,但我尝试过@State
并得到相同的结果。
我知道我可以通过添加来伪造它.id(UUID())
,但我不确定这是否是最好的方法。
我怎样才能更新ButtonStyle
?
只需将其定义
selected
为普通属性即可。这是一个例子,我只是将其更改@AppStorage
为@State
更容易测试:@State var selected
在中使用时ButtonStyle
,它只会在身份创建时接收值,这会增加.id(UUID())
工作量,因为它会导致当前 ButtonStyle 被销毁,并Identity
创建一个新的 ButtonStyle,因此ButtonStyle
会接收selected
更改。我建议您观看“揭秘 SwiftUI”以加深理解。