- 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/
我正试图从这里众所周知的新手深渊中爬出来。 我开始掌握 @EnvironmentObject 的使用,直到我注意到文档中的 .environmentObject() View 运算符。 这是我的代码:
在我的 ContentView ,我有一个简单的按钮 sheet我的礼物SettingsView .好像和我的@EnvironmentObject var iconSettings: IconName
#SwiftUI 中似乎存在一个错误,其中 @EnvironmentObject如果用户拉下模态表以关闭它,但取消手势使其保持打开状态,则将不再可用。 实际错误: SwiftUI:0: Fatal e
我有一个使用 Storyboard 和 UIKit 构建的 iOS 项目。现在我想使用 SwiftUI 开发新屏幕。我向现有的 Storyboard 添加了一个托管 View Controller ,
SwiftUI 中的@Environment 和@EnvironmentObject 有什么区别? 从我从文档中找到的内容来看,@Environment 似乎是用于像 ColorScheme 这样的全
我想要一个变量作为 EnvironmentObject 并且我也希望它被持久化,这样每次我重新启动我的应用程序时它都是一样的。 为此,我已经创建了以下 propertyWrapper: import
我想从 Delegate 类中为 EnvironmentObject 设置值。 struct AppleMapView: UIViewRepresentable { @EnvironmentObj
我最近发现需要编写一个 Class 的 Mock,因为它会导致 SwiftUI preview 无法正常工作。不幸的是,我得到了错误: Property type 'T' does not match
我的应用程序中有三个 View 。第一个显示游戏列表。第二个是每场比赛的球员名单。第三个有每个玩家的得分列表。所以结构看起来像这样: struct GameView: View { @enviro
我有一个在工作线程中更新的@EnvironmentObject,并且几个 SwiftUI View 订阅了对已发布值的更改。 这一切都很好。 但我正在努力让 UIView 订阅@Environment
我有这种奇怪的行为,我已经尝试修复了好几个小时: 当 EnvironmentObject UserSettings 更改时,我的一个 View 未更新。尽管如果我完全重新启动应用程序,新值将按原样使用
我一直在阅读有关 SwiftUI 中的属性包装器的信息,我发现它们做得很好,但我真正不明白的一件事是 之间的区别。 @EnvironmentObject 和 @ObservedObject . 从我到
我试图在我的 URLSession 中更新 environmentObject。 我的登录 View 。 struct LoginView: View { @EnvironmentObject
是否可以在新的 SwiftUI 2.0 项目的应用程序文件中使用 EnvironmentObject? 我正在使用以下代码,但出现错误: Fatal error: No ObservableObjec
我成功地将 environmentObject appSettings 传递到我的 View 中。我可以使用它来修改我的字体和 View 中的选择器。但是,如果我尝试在 View init() 中访问
我遇到以下 SwiftUI 错误 @EnvironmentObject与自定义 Shape 一起使用时, : Fatal error: No ObservableObject of type MyOb
我用我的 @EnvironmentObject让我的 TeamData 可以被不同的人使用,但效果不佳。当我通过列表中的导航链接转到另一个 View 时,这很好。当我点击同一 View 的按钮时,它崩
我有一个 LoginView,如果用户未登录,则显示 RegisterView,如果用户已登录,则显示 ContentView: struct LoginView: View { @Envir
我正在尝试使用 @EnvironmentObject 来控制我的应用程序的某些方面。我遇到的问题是我的一个 Controller 无法访问环境对象。我收到 fatal error “未找到环境类型的
我在将类信息从一个结构实例传递到另一个结构实例时遇到了麻烦,所以我一直在尝试解决问题。 这是可行的,因为我正在通过 View // phone_testingApp.swift import Swif
我是一名优秀的程序员,十分优秀!