首页 > 解决方案 > 为什么自定义 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作为示例,所以我知道这些可能不是一般的最佳实践。

感谢您的帮助!

标签: iosswiftiphoneswiftuiuikit

解决方案


SwiftUI 是一个函数式编程的东西。Structs 是值类型(不是引用类型)。结构通常是不可变的。

您可以简单地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可以在视图本身内部进行更改。


推荐阅读