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 View
s,@Published
内的 ObservableObject
除外。
我没有在任何文档中明确找到这一点,但包装器符合 DynamicProperty
并且您查看文档中的说明
视图在重新计算视图主体之前为这些属性赋值。
因此暗示如果包装变量不在 struct
中,这也是一个 SwiftUI View
,它不会获得更新的值,因为它没有 body
。
https://developer.apple.com/documentation/swiftui/dynamicproperty
错误在于它可以在 Playgrounds 中使用,但 Playground 似乎有一些这样的东西。可能是因为它遵守和运行的方式。
【讨论】:
以上是关于Swift:结构实例不更新视图的主要内容,如果未能解决你的问题,请参考以下文章