首页 > 其他分享 >SwiftUI中全局EnvironmentObject的使用和注意事项,实现多界面共享数据

SwiftUI中全局EnvironmentObject的使用和注意事项,实现多界面共享数据

时间:2024-07-21 18:27:12浏览次数:11  
标签:预览 对象 视图 SwiftUI 注意事项 var 全局 EnvironmentObject Man

SwiftUI的@EnvironmentObject是一个强大的工具,它允许你在多个视图之间共享数据(使用一个可观察对象)。当你有一个复杂的视图层次结构,并且需要在没有直接连接的视图之间共享相同的可观察对象时,它特别有用。

创建ObservableObject协议类

要使用环境对象,首先需要创建一个符合ObservableObject协议的ObservableObject类,这个类将保存我们希望在视图之间共享的数据。并将可以观察的属性使用 @Published 属性包装器声明,不然访问和修改该属性可能会导致app崩溃!例如:

//
//  Model.swift
//  SwiftBook
//
//  Created by song on 2024/7/11.
//

import Foundation

// 创建模型类
class Person: ObservableObject {
    
    @Published var id: Int = 0

    @Published var manList: [Man] = [
        Man(index: 1, name: "王思聪", avator: "xigua", content: "好好"),
        Man(index: 2, name: "王健林", avator: "liulian", content: "你好"),
        Man(index: 3, name: "马云", avator: "taozi", content: "今天"),
        Man(index: 4, name: "马化腾", avator: "default", content: "天气"),
        Man(index: 5, name: "王亮", avator: "juzi", content: "真"),
        Man(index: 6, name: "王伦", avator: "putao", content: "不累"),
    ]
}

// 创建结构体
struct Man: Identifiable {
    var id = UUID()
    var index: Int
    var name: String
    var avator: String
    var content: String
}

引入协议类对象

引入这个全局对象的地方有两个地方需要注意:

1.app入口函数的视图中(app启动的时候要保证全局有这个对象,不然会崩溃)

2.要观察全局对象的页面预览视图中(要保证预览页面可以访问到全局对象,不然会崩溃,无法预览或者修改全局对象的属性。即便你在app入口函数设置了,但是预览模式不会走这个入口函数,所以就没办法使用这个入口函数的全局对象)

页面视图修改和访问全局对象

在页面视图中,可以通过声明的@EnvironmentObject var person: Person对象来访问这个全局对象,并通过person.id = 3 的形式来给属性赋值(注意需要将该属性使用@Published属性包装器声明),而且修改后的值,在另外一个页面视图中也是可以成功访问到的。

注意事项

1.使用前一定要在环境变量中添加一个全局对象.environmentObject(Person())

比如你在当前视图中要使用预览功能预览当前页面,就要给当前页面的#Preview函数中添加

2.即便你在App入口函数中添加了这个对象,但是你却在预览中使用这个全局对象,但是你却没有在预览的视图中添加.environmentObject(Person()),程序依然会报错并崩溃!因为预览模式下没有走App的入口函数,所以视图中就没有这个全局对象

3.如果需要向环境中添加多个对象,则应该添加多个.environmentObject修饰符,一个一个的添加即可。

struct EnvironmentObjectDemo: View {
  @StateObject var gameSettings = GameSettings()
  @StateObject var videoSettings = VideoSettings()

    var body: some View {
      NavigationView {
        ......
      }
      .environmentObject(gameSettings)
      .environmentObject(videoSettings)
   }
}

4.另外如果创建了两个同类型的ObservableObject对象,并且依次添加到环境中去,那么最早添加的那个起作用,后添加的无效

标签:预览,对象,视图,SwiftUI,注意事项,var,全局,EnvironmentObject,Man
From: https://blog.csdn.net/weixin_44786530/article/details/140358637

相关文章

  • swiftui中使用scaleEffect和rotationEffect实现缩放和旋转效果
    在SwiftUI中,你可以使用.scaleEffect()和.rotationEffect()来实现缩放和旋转动画,缩放和旋转的内容可以是图片,文字等view视图。scaleEffect可以实现缩放效果,配合动画可以实现好看的过度效果,其中的参数是缩放的倍数,1表示原本大小,大于1表示放大,小于1表示缩小。示例代码:Text("He......
  • Android C++系列:函数返回值注意事项
    1.背景函数返回值就是使用return语句终止正在执行的函数,看是很简单的问题有什么说的呢?因为越是简单的问题里面越是有一些不易发现的坑。比如在循环中使用return语句:boolfindChar(conststring&str,constcharc){autosize=str.size();for(decltype(size......
  • 类明显存在却报 package not found, Java程序中专门被其他工程所依赖的common jar用sp
    先上官方链接:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/maven-plugin/examples/repackage-classifier.html在使用SpringBoot构建通用JAR库时,尤其是当通springboot默认的过spring-boot-maven-plugin插件打包时。如果遇到了类存在但报“packagenotfound......
  • C++ 函数重载注意事项
    C++中的函数重载(FunctionOverloading)是一种允许同一作用域内存在多个同名函数,但是这些函数的参数列表(参数的类型、个数或顺序)必须不同。这使得函数可以根据传入参数的不同而执行不同的任务。然而,在使用函数重载时,需要注意以下几个重要事项:参数列表必须不同:函数的参数个数、......
  • c++ primer plus 第16章string 类和标准模板库,16.2.2 有关智能指针的注意事项
    c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项文章目录c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项16.2.2有关智能指针的......
  • C/C++ 逻辑表达式的注意事项
    在C/C++中,逻辑表达式是用于控制程序流程的重要工具,尤其是在条件语句(如if、while、for等)中。正确使用逻辑表达式对于编写高效、易于理解的代码至关重要。以下是一些使用C/C++逻辑表达式时的注意事项:运算符优先级:逻辑运算符(&&、||、!)具有不同的优先级。!(逻辑非)具有较高的优......
  • SwiftUI Release 引入的辅助焦点管理
    文章目录前言使用@FocusState属性包装器高级技巧:专用辅助技术可聚焦字段的高级用法优化体验运行截图总结前言SwiftUIRelease引入了强大的新功能,其中之一是辅助焦点管理。这个新功能使得在SwiftUI中处理辅助技术(如VoiceOver和SwitchControl)的焦点状态变得......
  • C/C++ 位运算注意事项
    在C/C++中使用位运算时,需要注意多个方面以确保代码的正确性和效率。以下是一些关键的注意事项:1.操作数类型整型数据:位运算符(如&、|、^、~、<<、>>)只能用于整型数据,包括带符号或无符号的char、short、int、long等类型。尝试对非整型数据(如float、double)进行位运算会导致编......
  • C/C++ 逗号表达式的注意事项
    在C和C++中,逗号表达式是一种使用逗号运算符,分隔的表达式序列。逗号运算符用于顺序执行其操作数,并返回最后一个操作数的结果。尽管逗号表达式在某些情况下很有用,但它们也需要注意一些重要的细节和潜在的问题。1.逗号表达式的定义和用法逗号表达式由一系列表达式组成,这些表......
  • 阳澄湖礼券怎样兑换实物:了解阳澄湖礼券兑换实物的流程与注意事项,享受购物优惠
    ①:了解礼券信息:有效期:确认礼券的有效期,避免过期失效。使用范围:了解可以使用礼券的商家或兑换地点。面值和数量:确认礼券的面值和数量,以便兑换时使用。②:选择商品或服务:查看产品目录:在指定商家或网站上查看可以使用礼券兑换的商品或服务目录。③:兑换流程:到店......