对于这三个特性,我们可以简单记录一下,EnvironmentObject修饰属性是当前的环境变量,并在它自己以及它的子视图都可以直接使用,也可以叫做当前当前视图全局变量。下面我们看一个编辑学生姓名的例子:

先定义一个学生数据模型,如下:

class Student: ObservableObject {@Published var name = ""
}

然后在写一个编辑框,编辑学生的姓名:

struct EditStudentView: View {@EnvironmentObject var user: Studentvar body: some View {TextField("请输入学生姓名", text: $user.name)}
}

然后在创建一个显示学生姓名的视图:

struct DisplayStudentView: View {@EnvironmentObject var user: Studentvar body: some View {Text(user.name).frame(width: 200, height: 20, alignment: .center).border(Color.red, width: 1).background(Color.green)}
}

最后我们在ContentView.swift这个文件里添加这两个视图:

struct ContentView: View {let student = Student()var body: some View {VStack(alignment: .leading) {EditStudentView().frame(width: 300.0, height: 40.0).padding(.horizontal, 20.0).border(Color.black, width: /*@START_MENU_TOKEN@*/1/*@END_MENU_TOKEN@*/).cornerRadius(/*@START_MENU_TOKEN@*/3.0/*@END_MENU_TOKEN@*/).padding().environmentObject(student)DisplayStudentView().frame(width: 300, height: 40, alignment: .center).border(/*@START_MENU_TOKEN@*/Color.black/*@END_MENU_TOKEN@*/, width: /*@START_MENU_TOKEN@*/1/*@END_MENU_TOKEN@*/).padding().environmentObject(student)Spacer()}}
}

最后我们通过xcode的预览功能,查看效果。在这里我们要说一下,我们发现编辑和显示两个视图他们之间并没有直接的关系,但是他们都是Content的子视图,而且他们两个都是获取的Content的变量,这样在环境变量中就只有一份内容,所以才会在编辑的时候能及时的显示出姓名。下面我们在添加一层。

在显示的视图上修改成如下:

struct DisplayStudentView: View {var body: some View {StudentNameView()}
}struct StudentNameView: View {@EnvironmentObject var user: Studentvar body: some View {Text(user.name)}
}

把Content改成如下的形式:

struct ContentView: View {@EnvironmentObject var student: Studentvar body: some View {VStack(alignment: .leading) {EditStudentView().frame(width: 300.0, height: 40.0).padding(.horizontal, 20.0).border(Color.black, width: /*@START_MENU_TOKEN@*/1/*@END_MENU_TOKEN@*/).cornerRadius(/*@START_MENU_TOKEN@*/3.0/*@END_MENU_TOKEN@*/).padding()DisplayStudentView().frame(width: 300, height: 40, alignment: .center).border(/*@START_MENU_TOKEN@*/Color.black/*@END_MENU_TOKEN@*/, width: /*@START_MENU_TOKEN@*/1/*@END_MENU_TOKEN@*/).padding()Spacer()}}
}

再次预览的时候,我们发现和上边的效果一样。通过这一点的细微的变化,我们也许能够明白点这里的问道了吧,实践是检验真理的唯一标准。慢慢体会。。。

下面转载一个博客的一段话:

  • @State和@ObservableObject之间有一些细微的差异。这些都是很重要的,因为它们都有不同的用途。首先,@State在视图本地。值或数据在视图中本地保存。它由框架管理,由于它存储在本地,因此它是一个值类型。但是@ObservableObject在视图外部,并且不存储在视图中。它是一种引用类型,因为它不在本地存储,而只是具有对该值的引用。这不是由框架自动管理的,而是开发人员的责任。这最适用于外部数据,例如数据库或由代码管理的模型。

  • @Binding也在视图内,但是与@State区别在于@Binding用于不通视图之间的参数传递。@Binding 和@ObservedObbjecg一样都是传递引用。

  • @EnvironmentObject 可以理解为全局变量
    具体细微差别,大家可以访问demo页面体验用途的不同。

作者:iCloudEnd
链接:https://www.jianshu.com/p/9915b91495da
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

SwiftUI开发-@EnvironmentObject、ObservableObject、@Published理解相关推荐

  1. 学习使用SwiftUI开发MacOS应用 - 第1节 如何创建SwiftUI 应用并实现窗口交互

    在这一节里,我们不和其他教程一样细讲每个实现原理,从我们大多数应用中经常碰到的窗口操作去实现,比如 如何在SwiftUI 中实现一个登陆窗口,并且当成功登陆后关闭登陆窗口并打开主窗口,以及了解如何设置 ...

  2. iOS SwiftUI 开发实机测试 TextField 不显示字

    iOS SwiftUI 开发实机测试 TextField 不显示字 iOS 实机测试不显示文字 解决问题 iOS 实机测试不显示文字 记录一个很蠢的问题,如图所示: 我勒个大槽,明明预览和模拟机上都有 ...

  3. 从 .NET 开发人员的角度理解 Excel 对象模型--------结合上一篇 vb code excel 单元格锁定...

    从 .NET 开发人员的角度理解 Excel 对象模型 发布日期: 10/27/2004 | 更新日期: 10/27/2004 Ken Getz MCW Technologies, LLC 适用于: ...

  4. 从 .NET 开发人员的角度理解 Excel 对象模型 (From MSDN)

    从 .NET 开发人员的角度理解 Excel 对象模型 发布日期 : 10/27/2004| 更新日期 : 10/27/2004 Ken Getz MCW Technologies, LLC 适用于: ...

  5. 关于开发的一些个人理解思路(5W1H分析法)

    关于开发的一些个人理解思路(5W1H分析法) (以下理论知识来源 百度百科) 何为5W1H分析法,5W1H(WWWWWH)分析法也叫六何分析法,是一种思考方法,也可以说是一种创造技法.在企业管理.日常 ...

  6. macOS SwiftUI开发教程之Scenekit 3D飞机 (项目含源码)

    实战需求 macOS SwiftUI开发教程之Scenekit 3D入门 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 SCNScene(named: "art ...

  7. SwiftUI 绘图类精品项目大全之使用 SwiftUI 开发所见即所得的绘图应用程序 (教程含源码)

    本文探讨使用 SwiftUI 开发所见即所得 (WYSIWYG) 矢量绘图应用程序.所见即所得的矢量绘图应用程序可以被认为是在画布上呈现不同对象(例如矩形.椭圆形.文本或其他形状)的应用程序:通过拖动 ...

  8. 以太坊智能合约开发第二篇:理解以太坊相关概念

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 很多人都说比特币是区块链1.0,以太坊是区块链2.0.在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太 ...

  9. 从 .NET 开发人员的角度理解 Excel 对象模型

    适用于: 用于 Microsoft Office 系统的 Microsoft Visual Studio 工具 Microsoft Office Excel 2003 Microsoft Visual ...

最新文章

  1. 4412 GPIO读 和 ioremap控制GPIO寄存器
  2. PacketTracer 5.2基于AAA的Easy ×××实验
  3. 【Flask项目】sqlalchemy原生sql查询,返回字典形式数据
  4. 【caffe-Windows】新层添加——LSTM
  5. 提升代码可读性的 10 个技巧
  6. http://blog.51cto.com/yfsoft/324291
  7. php navigator,微信小程序组件:navigator页面链接解读和分析
  8. 十多年前国内的三大杀毒软件瑞星、江民和金山毒霸的现状如何?
  9. 每次都错部分分怎么办,总是个别点TLE,WA
  10. 标准模板库中的优先队列(priority_queue)
  11. 悟道web标准:前端性能优化
  12. 小乌龟与git配置使用
  13. Linux自学day2
  14. 无法识别 移动固态硬盘_固态硬盘不识别怎么办 固态硬盘不认盘解决方法介绍...
  15. 大招:召唤最优的多因素cox模型
  16. openstack neutron网络插件学习(二)【linux-bridge实现】
  17. java通过FTP连接到NAS服务器
  18. 弱者都自大暴躁,强者都低调温柔
  19. Rasa项目实战之银行金融Financial Bot智能业务对话机器人业务功能微服务解析与调试(九十二)
  20. 如何写一封好的情书?Python三步爬取全网情诗信息

热门文章

  1. linux中lvm卷管理
  2. 关于代码审查的一些探讨和总结
  3. rim lighting
  4. 广西机电职院计算机系,广西机电职院崇左东盟学院办学点揭牌仪式暨2019级大专班开学典礼在东盟学院隆重举行...
  5. IOC和AOP的面试题
  6. 静脉炎是由哪些原因引起的呢?
  7. Python数据分析报告:北京市每月PM2.5的值和分析影响PM2.5
  8. [转载]ZT:趋势交易者的利器----MACD指标在美元指数判断与实战中的运用
  9. 你不知道的 async、await 魔鬼细节
  10. 计算机中常见的信息存储格式,信息保存在计算机中的基本形式是什么?