【问题标题】:Swift: Struct instances not updating viewSwift:结构实例不更新视图
【发布时间】:2022-01-24 03:00:06
【问题描述】:

以下代码被简化和隔离。它的目的是有一个 Text() 视图,它显示按钮被点击的次数,以及一个 Button() 来增加文本视图。

问题:单击按钮实际上并没有改变 Text() 视图,而是继续显示“1”

struct Temp: View {
    
    @State var h = struct1()

    var body: some View {
        VStack {
            Button(action: {
                h.num += 1
            }, label: {
                Text("CLICK ME")                
            })
            Text(String(h.num))
        }
    }
}

struct struct1 {
    @State var num = 1
}

有趣的是,相同的代码也可以在 swift playground 中运行(显然 Text() 更改为 print())。所以,我想知道这是否是 XCode 特定的错误?如果不是,为什么会这样?

【问题讨论】:

  • 从不是 SwiftUI 视图的结构中取出状态。它不属于那里。
  • @lorem ipsum,这解决了它!谢谢!我不知道为什么,但......你能回答一下,也许会说为什么会这样吗?
  • State 属性包装器专门用于 SwiftUI 视图,而不仅仅是任何结构。
  • @chuk 你介意接受答案吗?它是下面的绿色复选标记

标签: swift xcode struct swiftui


【解决方案1】:

struct1中的变量中删除@State

SwiftUI 包装器仅适用于 SwiftUI Views,@Published 内的 ObservableObject 除外。

我没有在任何文档中明确找到这一点,但包装器符合 DynamicProperty 并且您查看文档中的说明

视图在重新计算视图主体之前为这些属性赋值。

因此暗示如果包装变量不在 struct 中,这也是一个 SwiftUI View,它不会获得更新的值,因为它没有 body

https://developer.apple.com/documentation/swiftui/dynamicproperty

错误在于它可以在 Playgrounds 中使用,但 Playground 似乎有一些这样的东西。可能是因为它遵守和运行的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多