回到过去,当您需要控制视图层次结构深处的某些内容时,您可以简单地使用
NotificationCenter.default.addObserver
然后向您的对象发布通知,它们就会发生变化。
现在使用 SwiftUI,如果您只有一层视图,您可以简单地将@State
变量传递到下一个视图,然后将对其进行绑定。
但想象一个深度为 4 个视图的视图。
View A > View B > View C > View D
我认为将变量传递 4 层深度并不优雅@State
,因此View D
可以更改它。
另一种丑陋的方法是创建一个@Observable
带有变量的单例@Published
。
这样做的常见做法是什么?
SwiftUI 有一个专门为此目的而设计的环境系统。值在 SwiftUI 视图层次结构中的某一点声明(通常但并非总是在最顶层),并自动与所有该视图的子视图、其所有子视图等共享。需要使用该数据的视图选择这样做。
环境中的每条数据都有一个独特的键,用于在顶部设置值并在需要时检索它。
有以下三种使用方式:
对于值类型(结构体、枚举、内置类型,例如
Int
和String
),您可以创建EnvironmentValues
使用键路径来标识值的自定义类型。环境:
使用:
创建自定义环境密钥需要一些样板代码,但每次都几乎相同。这只是一篇带有示例的博客文章,还有更多示例。
对于引用类型(类),长期存在的方法是使您的类符合
ObservableObject
. 你的班级类型成为关键:iOS 17+中的新功能是使用新
@Observable
宏的替代语法,该宏取消了ObservableObject
andPublished
: