SwiftUI 如何知道将哪个 environmentObject 分配给哪个变量

Posted

技术标签:

【中文标题】SwiftUI 如何知道将哪个 environmentObject 分配给哪个变量【英文标题】:How does SwiftUI know what environmentObject to assign to which variable 【发布时间】:2020-06-29 18:49:05 【问题描述】:

假设我有一个ViewEnvironment Object,如下所示:

struct MyView: View 
    @EnvironmentObject
    var viewModel: RegisterViewModel

在祖先的某个地方,我会像这样提供这个对象:

NavigationView 
    LoginView()

.environmentObject(RegisterViewModel())

将此值实际分配给var viewModel 的机制是什么。我的代码中没有任何地方需要指定变量的名称,但它已正确分配。如果我的同类型环境对象很少,会发生什么?

【问题讨论】:

【参考方案1】:

EnvironmentObjects 由 type 标识。

SwiftUI 只是查找特定类型的环境变量(这里是 RegisterViewModel)并使用它找到的第一个。

这段代码RegisterViewModel放到环境中:

.environmentObject(RegisterViewModel())

然后,在构建视图时,SwiftUI 会在环境中查找 RegisterViewModel 类型:

@EnvironmentObject var viewModel: RegisterViewModel

更多细节:

How to set multiple EnvironmentObjects which are same type Why can't swiftui distinguish 2 different environment objects?

【讨论】:

如果我定义两个相同类型的变量会发生什么?他们会都被分配到最后一个提供的吗? @DamianDudycz 请参阅Why can't swiftui distinguish 2 different environment objects? 和How to set multiple EnvironmentObjects which are same type

以上是关于SwiftUI 如何知道将哪个 environmentObject 分配给哪个变量的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何快速识别视图(View)界面的刷新是由哪个状态的改变导致的?

SwiftUI 如何快速识别视图(View)界面的刷新是由哪个状态的改变导致的?

自定义按钮样式 (SwiftUI) tvOS

在 UISplitViewController 中使用 SwiftUI 列表侧边栏

SwiftUI:响应 macOS 上的应用程序终止

如何确定在 SwiftUI 中的多词文本视图中点击的词