ios - 为什么自定义 SwiftUI View 不对状态变化使用react

标签 ios swift iphone swiftui uikit

我在 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/

相关文章:

iOS 5 - 连接到 HTTPS 服务器

ios - 具有相同 NSUserdefaults 的免费和付费游戏

ios - 如何切换 UITableViewContoller/UITableViewCell 中的选定行

iphone - 在iPhone Objective c中的同一父节点下解析多个具有相同名称的标签

iphone - 可以在 iPhone 的状态栏中添加另一个时钟吗?

iphone - iOS 6 - 处理顶部和底部的黑色条纹

ios - 为 NSArray 中的对象运行 NSTimer

swift - 如何在swift中检查变量的类型

iphone - iOS : Hide status bar in entire app programmatically not even through plist

iphone - 创建 Sprite 时出错