欢迎光临散文网 会员登陆 & 注册

swiftUI笔记3|@EnvironmentObject和@ObservedObject

2023-08-24 12:54 作者:便宜酒  | 我要投稿

使用场景:观察者模式。定义了某种时刻更新的数据模型,某些视图中需要持续观察该数据并作出相应变化,就像社交软件粉丝数量的增长。

本篇包含:

Observable协议

@Published属性包装器

@ObservedObject属性包装器

@EnvironmentObject属性包装器

@StateObject属性包装器

@State属性包装器

@Binding属性包装器

1 定义一个时刻更新的数据模型——发布者

这里用一个struct描述某种数据的属性,再用一个class存放这种数据的数组及其他属性。该class需要遵循ObservableObject协议,这使得其下被@Published包装的属性一旦更新就会发布通知。

Don't specify a default or initial value for the observed object

那么谁来接收通知呢?

2 订阅者

在某个视图中,使用@ObservedObject包装的属性就是订阅者,例如

视图中需要data数据的地方都会根据数据源更新而变化。

如果是在自视图中,也可以使用@EnvironmentObject包装该属性

那么在创建某个子视图时,不是用childView(data: 数据源, ...)传入数据,而是childView().

environmentObject(数据源)。

3 @StateObject属性包装器

它也是订阅者,但是与 @ObservedObject 不同,@StateObject 的对象会一直存在于整个视图的生命周期中,不会因为视图的重新渲染而被销毁和重建。这使得 @StateObject 适用于那些需要持久状态且与视图密切相关的数据对象,比如页面导航、用户输入等。

4 @State和@Binding

@EnvironmentObject适用于全局共享数据,而@ObservedObject适用于单个视图与特定数据对象的关联。它们在不同的场景下可以一起使用。

以上是跨视图的一组包装器,还有一组用于从外部修改某一个特定视图内数据的包装器@State和@Binding。

@State:用于在一个视图内部创建一个可以被视图修改的局部状态。它常用于存储一些视图自身的状态,当 @State 的值发生变化时,视图会自动重新渲染。

@Binding:用于将外部的数据绑定到视图中,使得视图能够修改外部数据。它通常用于在父视图中将数据传递给子视图,并让子视图能够修改父视图中的数据。

@State 和 @Binding 主要用于视图内部的状态管理和与外部数据的双向绑定,适用于处理局部的、特定于视图的数据。

@Published 和 @ObservedObject 主要用于创建可观察对象和将可观察对象关联到视图,适用于处理全局状态、跨视图的数据共享和自动刷新。


swiftUI笔记3|@EnvironmentObject和@ObservedObject的评论 (共 条)

分享到微博请遵守国家法律