【问题标题】:Why doesn't custom SwiftUI view react to state changes为什么自定义 SwiftUI 视图不响应状态变化
【发布时间】:2021-07-07 15:14:30
【问题描述】:

我在 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)
    }
}

textcolor 更改时不会自动更新。例如,如果我有这样的视图

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 作为示例,所以我知道这些可能不是一般的最佳做法。

感谢您的帮助!

【问题讨论】:

    标签: ios swift iphone swiftui uikit


    【解决方案1】:

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

    您可以在子视图结构中简单地使用lets。

    为什么 - 当@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 可以在视图本身内部进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2017-03-25
      • 2014-11-06
      相关资源
      最近更新 更多