- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我们有 @Binding 属性包装器时,@EnvironmentObject 的目的是什么?我无法弄清楚为什么需要@EnvironmentObject。我查看了这些帖子,但它并不是我想要的 EnvironmentObject in SwiftUI How to use BindableObjects (EnviromentObject)?
我还查看了他们的文档,但文档太薄了。 https://developer.apple.com/documentation/swiftui/environmentobject
最佳答案
我将尝试进行一般性解释。我们有下一个修饰符 @State
, @StateObject
, @ObservedObject
@Published
, @EnvironmentObject
, 和 @Binding
.
@State
- 声明局部值属性。 Apple 建议尽可能少地使用它们,因为 @State
属性应该只在 View 内部使用,并负责小的 UI 事情。它应该有一个简单的值类型,而不是引用类型,否则,它不会为您更新 UI。@StateObject
- 声明并实例化对象实例。通常,应该显示的是您的数据模型。该对象必须符合 ObservableObject 协议(protocol)。@ObservedObject
- 声明一个使用标记为 @StateObject
的实例的属性已从父 View 传递。当您不希望可重用 View 依赖于外部对象时,这是一个不错的选择。这样你就通过了 @StateObject
直接到每个 subview 。@EnvironmentObject
- 还将属性声明为 @ObservedObject
确实如此,但是当您将实例传递给所有 subview 树时,应该使用此修饰符。要将实例传递给 subview ,只需调用 YourViewToPresent().environmentObject(<your object>)
.然后这个 subview 及其 subview 可以使用 @EnvironmentObject var instance: YourInstance
访问一个实例无需额外的努力或传球。此修饰符查找已声明类型的实例,因此您不能在同一环境中声明多个相同类型的对象。您还应该小心,不要过度使用它,因为这可能会在您的项目(库、框架)上打开很多架构后门。@Published
- 应该用来标记ObservableObject
更改 View 时重新呈现 View 的变量。@Binding
- 定义该属性可以修改真正的真相来源(@State, @ObservedObject, @EnvironmentObject
)。当您将其中一个属性从 1-3 点传递到 View 时,您必须在 subview 中将该属性声明为 @Binding
创建一个引用。使用 $
将真理之源传递给 child 的标志:MessageDetails(message: $message)
.通过更改 @Binding
您将改变实际的真理之源。更多资讯推荐观看Data Flow Through SwiftUI 奖励: @Environment
- 用于通过使用 keyPath @Environment(\.colorScheme)
获取环境值.您可以读取此值,但无法设置此值。如果更改值,则会导致 UI 重新呈现。 SwiftUI 可能会更新一些值。要查找所有可用 key ,请查找 EnvironmentValues
的文档.您还可以覆盖和添加自定义 EnvironmentValue
.
关于ios - ObjectBinding 和 EnvironmentObject 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56510818/
SwiftUI 具有 .animate() 的隐式动画,以及使用 .withAnimation() 的显式.但是,我不知道如何为图像更改设置动画: struct ImageViewWidget : V
我有一个 SwiftUI View ,它有一个 @ObjectBinding progression: Progressable 像这样: struct ProgressBarComponent :
当我们有 @Binding 属性包装器时,@EnvironmentObject 的目的是什么?我无法弄清楚为什么需要@EnvironmentObject。我查看了这些帖子,但它并不是我想要的 Envi
我想删除一个标记为 @ObjectBinding 的对象,例如为了清理一些 TextFields。 我试图将对象引用设置为 nil,但没有成功。 import SwiftUI import Combi
我正在尝试学习Combine,它对我来说是一个PITA。我从未学过 RX Swift,所以这对我来说是全新的。我确信我错过了一些简单的事情,但希望得到一些帮助。 我正在尝试从 API 获取一些 JSO
我正在尝试在 SwiftUI 中设置一个基本列表,但我遇到了一个对我来说意义不大的编译时错误。这是错误: Cannot convert value of type 'Text' to closure
我有一个简单的 bean,它有一些相互关联的属性。例如,这个 bean 有一个名为 discountRate 的属性和另一个名为 discountValue 的属性。 discountRate 是应用
在 SwiftUI 中,您可以将 Publisher 的实例直接用作 @ObjectBinding 属性,还是必须将其包装在实现 BindableObject 的类中? let subject = P
我正在测试 Combine 框架并使用 BindableObject 作为通知中心,以便在 SwiftUI ContentView 的多个 View 之间传递数据。 其中一个 View 是一个表。我单
我是一名优秀的程序员,十分优秀!