Swift:结构实例不更新视图

Posted

技术标签:

【中文标题】Swift:结构实例不更新视图【英文标题】:Swift: Struct instances not updating view 【发布时间】: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 你介意接受答案吗?它是下面的绿色复选标记 【参考方案1】:

struct1中的变量中删除@State

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

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

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

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

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

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

【讨论】:

以上是关于Swift:结构实例不更新视图的主要内容,如果未能解决你的问题,请参考以下文章

集合视图更新问题 - Swift

Swift 3 - 调用准备 segue 时视图不更新

Swift - 从不同的视图更新列表

Swift BarButtonItem 不更新

Swift UI:使用数组中的随机元素更新视图

如何在 Swift 的不同视图控制器中更新同一实体的属性?