ios - 为什么自定义 SwiftUI 视图不响应状态变化
问题描述
我在 SwiftUI 中遇到了许多不同的自定义视图的问题,那么为什么这样的代码
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)
}
}
text
当或color
更改时不会自动更新。例如,如果我有这样的观点
struct ContentView: View {
@State var text = "Hello"
var body: some View {
VStack {
HeaderText(text: self.text, color: .black)
Button("Change Text") {
self.text = "Goodbye"
}
}
}
}
我本来希望视图会使用新文本进行更新,但事实并非如此。我知道您可以使用 来完成此操作@Binding
,但我正在寻找一个更优雅的解决方案,类似于Text
工作原理。我只是使用这些视图并structs
作为示例,所以我知道这些可能不是一般的最佳实践。
感谢您的帮助!
解决方案
SwiftUI 是一个函数式编程的东西。Struct
s 是值类型(不是引用类型)。结构通常是不可变的。
您可以简单地let
在子视图结构中包含 s 。
为什么@State
- SwiftUI 在更改而不是修改视图时重新创建您的视图。这是通过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)
}
}
为什么问题中的代码不起作用,
这是因为这些状态变量使用给定值初始化(在父视图内)以及@state
在子视图(HeaderText)内所做的更改,因为 @State
可以在视图本身内部进行更改。
推荐阅读
- entity-framework - EFCore - 为什么我必须使子对象为空才能阻止它们插入?一对多
- python - 测试容器和 clickhouse 驱动程序错误:读取字节时出现意外的 EOF
- sql - SQL Schema for multiple many-to-many relationships
- javascript - Angular local reference issue in date picker
- google-cloud-platform - I have problem to connect me glassfish server from compute engine
- ios - How to send instant email with mail chimp in Swift?
- c# - 不允许请求的远程注册表访问
- javascript - Changing number in div to 2 decimal places
- mysql - How to optimize the "IN (SELECT..." query
- mysql - 1列中的Mysql百分比计算