首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从类而不是视图更改@EnvironmentObject

从类而不是视图更改@EnvironmentObject是通过在类中使用@EnvironmentObject属性包装器来实现的。@EnvironmentObject属性包装器允许我们在类中访问全局共享的环境对象。

要从类而不是视图更改@EnvironmentObject,我们需要执行以下步骤:

  1. 创建一个ObservableObject类,该类将作为我们的环境对象。这个类应该遵循ObservableObject协议,并使用@Published属性包装器来标记我们想要共享的属性。
代码语言:txt
复制
import SwiftUI
import Combine

class MyEnvironmentObject: ObservableObject {
    @Published var myData: String = "Hello World"
}
  1. 在我们的视图层次结构的顶部,使用.environmentObject(_:)修饰符将环境对象注入到环境中。
代码语言:txt
复制
import SwiftUI

@main
struct MyApp: App {
    @StateObject private var myEnvironmentObject = MyEnvironmentObject()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(myEnvironmentObject)
        }
    }
}
  1. 在我们的类中,使用@EnvironmentObject属性包装器来访问环境对象。
代码语言:txt
复制
import SwiftUI

class MyViewModel: ObservableObject {
    @EnvironmentObject var myEnvironmentObject: MyEnvironmentObject

    func updateData() {
        myEnvironmentObject.myData = "Updated Data"
    }
}

在这个例子中,我们创建了一个名为MyEnvironmentObject的ObservableObject类,并在其中定义了一个名为myData的属性。然后,在我们的应用程序的顶层,我们使用.environmentObject(_:)修饰符将MyEnvironmentObject实例注入到环境中。

接下来,在我们的MyViewModel类中,我们使用@EnvironmentObject属性包装器来访问MyEnvironmentObject实例。我们可以通过更新myEnvironmentObject.myData属性来更改环境对象中的数据。

这是一个简单的示例,展示了如何从类而不是视图更改@EnvironmentObject。根据具体的应用场景,我们可以根据需要在类中使用@EnvironmentObject属性包装器来访问和更改环境对象中的数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SwiftUI:使用 @EnvironmentObject 环境中读取自定义值

使用@EnvironmentObject视图A可以将对象放入环境中,视图E可以环境中读取对象,视图B,C和D不必知道发生了什么。...接下来,我们可以定义两个SwiftUI视图以使用我们的新。...这些将使用@EnvironmentObject属性包装器来表示此数据的值来自环境,不是在本地创建: struct EditView: View { @EnvironmentObject var...).environmentObject(user) } } } 这就是使我们的代码正常工作所要做的一切——您现在就可以运行该应用并更改文本字段,以查看其值显示在下面的文本视图中。...好吧,您已经了解到字典如何让我们使用一种类型作为键key,另一种类型作为值。环境有效地使我们可以将数据类型本身用作键,并将类型的实例用作值。

9.7K20

数组是如何随机访问元素?数组下标为什么0开始,不是1?

例如:二叉树,堆,图,等,是非线性表,是因为,在非线性表中,数据之间并不是简单的前后关系。 数组是如何随机访问数组元素? 数组是如何实现根据下标随机访问数组元素的吗?...同数组插入的原理类似 数组如何提高效率?...将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作,这样减少数据搬移次数节省耗时。...为什么数组要从 0 开始编号,不是1? 偏移角度理解a[0] 0为偏移量,如果1计数,会多出K-1。增加cpu负担。...为什么循环要写成 for(inti=0;i<3;i++)不是 for(inti=0;i<=2;i++)。

6.3K10
  • SwiftUI 4.0 的全新导航系统

    NavigationStack NavigationStack 两个角度入手以解决上述问题。...,因此无须创建多余的视图实例 对由同一型的值驱动的目标进行统一管理( 可以将堆栈中所有视图的 NavigationLink 处理程序统一到根视图中 ),有利于复杂的逻辑判断,也方便剥离代码 NavigationLink...绑定了数据后,通过 List 构造方法创建的循环或 ForEach 创建的循环中的内容( 不能自带点击属性,例如 Button 或 onTapGesture ),将被隐式添加 tag 修饰符,从而具备点击后可更改绑定数据的能力...Button("Action2"){} Button("Action3"){} }) image-20220612085945286 更改...相当一部分开发者由于版本适配的原因并不会使用新的 API ,因此,每个人都需要认真考虑如下问题: 如何从新 API 中获得灵感 如何在老版本中运用编程式导航思想 如何让新老版本的程序都能享受系统提供的便利

    10.3K62

    漫话:如何给女朋友解释为什么计算机0开始计数,不是1开始?

    当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式: for (int i=0; i<10; i++){ } 可以看到,为了保证循环10次,我们定义了一个整数变量0开始。...他认为,使用左闭右开的表达方式,当下标 1 开始时,下标范围为 1 <= i < N+1;当下标 0 开始时则是 0 <= i < N; 而显然后面这种表达式更加漂亮、优雅一些。...计数表示偏移量 很多人学习编程都是C语言开始的,那么,C语言就是一个典型的0-base语言(以0作为计数的开始),其实,这一约定早在BCPL时代就是这样的了。...在C语言还不叫C语言,还叫BCPL的时候,他的作者马丁·理察德就设计了数组0开始的索引方式。...开始的(1-based indexing),而对Python语言有巨大影响的另一门语言,C语言的索引则是0开始的。

    1.1K40

    探讨 SwiftUI 中的几个关键属性包装器

    @State 用于管理视图的私有状态。 它主要用于存储值类型数据(与视图的生命周期一致)。 典型应用场景 当需要因视图内的数据变化触发视图更新时,@State 是理想的选择。...@Binding 并不是独立的数据源。实际上,它只是对已存在数据的引用。...引入 @StateObject 意味着所有相关操作都在主线程上进行( SwiftUI 会隐式为视图添加 @MainActor),包括异步操作。应将需要在非主线程上运行的代码应该视图代码中剥离。...@EnvironmentObject @EnvironmentObject 是用于在当前视图中与上层视图经环境传递的 ObservableObject 实例之间创建关联的属性包装器。...(a) // 靠近视图的有效 .environmentObject(b) @Environment @Environment 是视图用于环境中读取、响应、调用特定值的属性包装器。

    32410

    SwiftUI 状态管理系统指南

    前言 SwiftUI与苹果之前的UI框架的区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用它的应用程序中管理视图层级的状态。...例如,我们可以将用户模型本身传递给ProfileEditingView,不是传递两个单独的username和email: struct ProfileEditingView: View { @...有了上面的类型,现在让我们回到ProfileView,让它观察新的UserModelController的实例,作为一个ObservedObject,不是用一个State属性包装器来跟踪我们的用户模型...一种是首先在想要检索给定对象的视图中定义一个EnvironmentObject包装的属性——例如像这个ArticleView如何检索一个包含颜色信息的Theme对象: struct ArticleView...} set { self[ThemeEnvironmentKey.self] = newValue } } } 有了上述内容,我们现在可以使用Enviroment属性包装器(不是

    5.1K20

    解析SwiftUI布局细节(二)循环轮播+复杂布局

    (我把它称为环境变量)这个是需要特别说明的一个变量,名字上可以看出,这个修饰符是针对全局环境的。...通过它我们可以避免在初始 View 时创建 ObservableObject, 而是环境中获取 ObservableObject,像 @EnvironmentObject,@ObservedObject...的方式去实现,很多同行有说目前来看SwiftUI的List在数据量大的情况下性能不是特别好,采用ScrollView是个不错的方式,而且也很容易构建出来,并不是说每一个Item的位置都需要你去计算,...Gesture 这个我们可以说说,它就是我们具体手势的父,像我们的单击手势和我们这里用到的拖拽手势一样。...这样基本上循环轮播的实现我们基本上都说清楚了,具体里面的一些实现细节代码注释写的清清楚楚,还是仔细看看代码结合里面的注释来看,难度不是很大。

    12.1K20

    解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

    本文将解析 SwiftUI 中两个由于未能贯彻响应式编程原则导致的严重错误,并提供相应的解决方案。...通过调用环境值或直接修改绑定状态,SwiftUI 则遵循了响应式编程原则,进行了的先调整状态,后更新视图的操作。...,左上角的 Back 按钮将消失,但视图并没有返回根视图图片如果我告诉你,上述情况正是由前文提到的状态更新滞后所导致,那么你该如何避免这个问题呢?...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好的选择,特别是在没有屏蔽手势取消 Sheet 的情况下。...幸运的是,我 @KyleSwifter 的 解密 SwiftUI 背后的 AttributeGraph 一文中找到了线索。

    707110

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    这也是 Redux-like 框架的优势之一( 将状态视图中抽离出来,方便测试 )。...在使用 environmentObject 的情况下,如何避免创建实例的视图被重新计算Q:如何在避免重新计算顶层视图 body 的情况下,在不同子树的两个子视图之间共享状态( 例如 ObservableObject...是否有其他方法可以直接根据状态的变化对视图进行动画处理不使用 onChange 修饰器?我的代码是这样的。....最近,我注意到 SwiftUI 视图的 onAppear 在意想不到的时间启动,比如当 UITabBarController 被创建时,不是视图本身出现时。...A:@EnvironmentObject / environmentObject 可能是跨视图层次共享同一模型的最佳工具。使用它们应该只创建一个实例,然后可以在子视图中读取。

    12.3K20

    避免 SwiftUI 视图的重复计算

    本文将介绍如何减少( 甚至避免 )类似的情况发生,从而改善 SwiftUI 应用的整体表现。...当 SwiftUI 将视图视图树上删除时,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...其他建议 需要跳跃视图层级时,考虑使用 Environment 或 EnvironmentObject 对于不紧密的 State 关系,考虑在同一个视图层级使用多个 EnvironmentObject...在这些创建实例的操作中,绝大多数的目的都是为了检查视图类型的实例是否发生了变化( 绝大多数的情况下,变化是由构造参数的值发生了变化导致 )。...当触发器接收到事件后,无论其是否更改当前视图的其他状态,当前的视图都会被更新。

    9.3K81

    @StateObject 研究

    在SwiftUI 1.0时代,如果想将引用类型作为source of truth,通常的方法是使用@EnvironmentObject或者 @ObservedObject。...上创建的,所以其生命周期必然不短于当前View,因此在使用中并不会发生由于生命周期不可预测导致的异常。...调试信息可以看出,当点击刷新时,CountViewObserved中的实例被重新创建了,并销毁了之前的实例(CountViewObserved视图并没有被重新创建,仅是重新求了body的值)。...当再次进入link后,@StateObject对应的视图中计数清零(由于返回父视图,再次进入时会重新创建视图,所以会重新创建实例),不过@ObservedObject对应的视图中计数是不清零的。...对我个人而言,基本失去了使用其的理由(可用于绑定父视图传递的@StateObject)。

    1.2K40

    深度解读 Observation —— SwiftUI 性能提升的新途径

    它的出现有望缓解开发者长期面临的 SwiftUI 视图无效更新问题。本文将采取问答的方式,全面详尽地探讨 Observation 框架,内容涉及其产生原因、使用方法、工作原理以及注意事项等。...如何视图中使用可观察对象 在视图中声明可观察对象 与遵守 ObservableObject 协议的 Source of Truth 不同,我们会在视图中使用 @State 来确保可观察对象的声明周期。...(StateObject、EnvironmentObject),这样不会引起混淆吗?...SwiftUI 的视图如何观察属性的变化 根据 Observation 框架的工作原理,我们可以推测 SwiftUI 大概会采用下面的方法在可观察属性与视图更新之间创建联系: struct A:View...Observation 是否解决了 ObservableObject 的性能问题 是的,Observation 框架两方面改善了可观察对象在 SwiftUI 中的性能表现: 通过观察视图中的可观察属性不是可观察对象

    57720

    打造可适配多平台的 SwiftUI 应用

    horizontalSizeClass ,无论应用的窗口尺寸如何,当前视图的 sizeClass 只能为 compact。...在“电影猎手”中,我们在 App 的位置创建了 Store(保存应用状态以及主要处理逻辑的单元)的实例,并通过 .environmentObject(store) 注入到根视图中。...这种通过 environmentObject 或 environment 来注入的信息,只能在为当前场景创建的视图树中被使用。...当然不是。在“电影猎手”中,应用层面的大多数状态是由 @AppStorage 来管理的,另外一些全局状态,则是通过 Core Data 来进行维护。...在 iOS 中,我们通过在根视图( ContentView )中修改环境值的方式来更改颜色和语言,并不会对 macOS 的 Settings 场景产生影响。

    2.1K10

    打造可适配多平台的 SwiftUI 应用

    horizontalSizeClass ,无论应用的窗口尺寸如何,当前视图的 sizeClass 只能为 compact。...在“电影猎手”中,我们在 App 的位置创建了 Store(保存应用状态以及主要处理逻辑的单元)的实例,并通过 .environmentObject(store) 注入到根视图中。...这种通过 environmentObject 或 environment 来注入的信息,只能在为当前场景创建的视图树中被使用。...当然不是。在“电影猎手”中,应用层面的大多数状态是由 @AppStorage 来管理的,另外一些全局状态,则是通过 Core Data 来进行维护。...在 iOS 中,我们通过在根视图( ContentView )中修改环境值的方式来更改颜色和语言,并不会对 macOS 的 Settings 场景产生影响。

    3.2K80

    ObservableObject研究

    在SwiftUI下开发,无论是主观还是客观都需要你将View的表述精细化,用更多的子View来组成你的最终视图不是把所有的代码都尽量写在同一个View上。...从上面几点看,无论任何角度,更精细化的View描述都是十分合适的。 但由于在单一数据源的情况下,我们将会有更多的View和Store建立依赖。...如何改善 在发现了上述的问题后,开始逐步尝试找寻解决的途径。 第一步 减少注入依赖 针对只要声明则就会形成依赖的的问题,我第一时间想到的就是减少注入依赖。...View树分支同EnviromentObject类似,注入EnviromentKey的依赖也是显性的 @Environment(\.myKey) var currentPage 我们可以通过以下方式,更改该...值类型无论如何都要比引用类型都更可控些。 •在当前View使用SwiftUI提供的其他包装属性我现在最常使用的SwiftUI的其他包装属性就属@FetchRequest了。

    2.4K60
    领券