/ Swift / 288 views

Swift Learing

Table of content

管理视图之间的数据流

在 Swift 中,property wrapper(属性包装器)封装了常见的属性初始化模式,帮助您有效地向属性添加行为。 SwiftUI 使用 @State@Binding 属性包装器等来帮助您维护视图可以轻松访问的事实来源。

State

当您将属性声明为 @State 时,您就在视图中创建了一个事实来源。系统识别依赖于 @State 属性值的视图的所有元素。
用户交互可能会更改您的 @State 属性。系统通过更新依赖于该属性的任何视图来呈现新版本的用户界面。

state

当 @State 属性值发生变化时,系统会自动使用更新后的属性值重新绘制视图。
由于状态属性有助于管理瞬态,例如按钮的突出显示状态、筛选器设置或当前选定的列表项,因此请将 State 属性声明为私有,并避免将它们用于持久存储。

@State 属性包装器是 SwiftUI 语法,用于定义视图结构本地的可变事实来源。但是,如果您想在视图层次结构中的另一个视图中使用相同的事实来源怎么办?

Binding

用 @Binding 包装的属性与现有事实源共享读写访问权限,例如 @State 属性。 @Binding 不直接存储数据。相反,它在现有事实来源与显示和更新该数据的视图之间创建双向连接。此连接可确保与一条数据关联的多个视图保持同步。

系统在 @State 中的数据和包含 @Binding 的子视图之间建立依赖关系。父视图或子视图都可以读取或修改您定义为事实来源的属性。如果子视图与父视图中定义的事实来源具有只读关系,则只需将该值传递给子视图即可。

App architecture 应用架构

这种使用绑定传播单一事实来源的模式对于视图层次结构中的任意数量的级别都是有效的。
使用 @State 和 @Binding 添加新的编辑功能,以便用户可以修改。您不需要编写代码来观察,因为系统会自动更新相关视图以反映对事实来源所做的更改。

Making classes observable

@State 属性包装器仅适用于值类型,例如结构和枚举。 SwiftUI 提供了属性包装器,将引用类型声明为事实来源:@ObservedObject 、 @StateObject 和 @EnvironmentObject。要将这些属性包装器与您的类一起使用,您需要使您的类可观察。

通过采用ObservableObject 协议来使类可观察。确定类中需要在更改时触发 UI 更新的属性。然后,将@Published属性添加到每个属性声明中。

Monitoring an object for changes

可以通过将以下属性之一添加到属性声明中来告诉 SwiftUI 监视可观察对象: ObservedObject 、 StateObject 或 EnvironmentObject 。使用这些包装器之一声明的视图属性为视图层次结构创建了新的事实来源。
使用 @StateObject 包装器创建一个可观察对象。您可以在 App 、 Scene 或 View 中创建状态对象。

ObservedObject

使用 @ObservedObject 属性包装器指示视图从父源(例如应用程序、场景或视图)接收对象。此父结构创建并拥有该对象,因此子视图不需要 ObservedObject 的初始值

EnvironmentObject

使用 @EnvironmentObject 属性包装器在复杂视图层次结构中共享可观察对象。您可以将对象放入环境中,而不是通过初始值设定项传递对象。 environmentObject(_:)视图修饰符将对象放置在视图环境中。

Steve
SwiftUI  Learning
SwiftUI Learning

0

  1. This post has no comment yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注