我在 SwiftUI 中的许多不同自定义 View 中都遇到过这个问题,那么为什么像这样的代码会出现这样的问题
struct HeaderText: View {
@State var text: String
@State var color: Color
var body: some View {
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
}
}
当文本
或颜色
更改时不会自动更新。例如,如果我有这样的 View
struct ContentView: View {
@State var text = "Hello"
var body: some View {
VStack {
HeaderText(text: self.text, color: .black)
Button("Change Text") {
self.text = "Goodbye"
}
}
}
}
我本希望 View 能够使用新文本进行更新,但事实并非如此。我知道您可以使用 @Binding
来完成此任务,但我正在寻找一种更优雅的解决方案,类似于 Text
的工作方式。我只是使用这些 View 和结构作为示例,因此我知道这些可能不是一般的最佳实践。
感谢您的帮助!
最佳答案
SwiftUI 是一种函数式编程。 Struct
是值类型(不是引用类型)。结构通常是不可变的。
您只需在 subview 结构中添加 let
即可。
原因 - 当 @State
更改时,SwiftUI 会重新创建您的 View ,而不是修改它。这是通过再次调用 body
来完成的。
struct HeaderText: View {
let text: String //<= here
let color: Color //<- here
var body: some View {
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
}
}
为什么问题中的代码不起作用,
这是因为这些状态变量使用给定值(在父 View 内)进行初始化,并且没有对 subview (HeaderText)内的@state
进行任何更改因为 @State
可以在 View 本身内部进行更改。
关于ios - 为什么自定义 SwiftUI View 不对状态变化使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68288674/