SwiftUI中 published 、observableObject、stateObject、EnvironmentObject的玩法

news/2024/7/20 22:51:20 标签: swiftui, ios, swift

SwiftUI中 published 、observableObject、stateObject、EnvironmentObject的玩法

记录一下SwiftUI中 published 、observableObject、stateObject、EnvironmentObject的玩法

@published

在 SwiftUI 中,@Published 是一个属性包装器(property wrapper),它通常与 ObservableObject 类一起使用,以便在属性发生变化时发出通知。这样,任何依赖于这些属性的 SwiftUI 视图都会自动更新。
@Published 属性包装器使得 ObservableObject 的属性可以作为一个 Publisher,允许其他对象订阅这个属性的变化。这是响应式编程的一个关键部分,特别是在 SwiftUI 中,它使得视图可以响应其状态的变化。

swift">import SwiftUI  
import Combine  
  
class ViewModel: ObservableObject {  
    @Published var count: Int = 0  
      
    func increment() {  
        self.count += 1  
    }  
}  
  
struct ContentView: View {  
    @ObservedObject var viewModel = ViewModel()  
      
    var body: some View {  
        VStack {  
            Text("Count: \(viewModel.count)")  
                .padding()  
            Button("Increment") {  
                self.viewModel.increment()  
            }  
        }  
        .padding()  
    }  
}

什么时候用observableObject什么时候用stateObject

在 SwiftUI 中,@ObservedObject 和 @StateObject 都是用于管理对象生命周期和响应对象状态变化的属性包装器,但它们的使用场景和生命周期管理策略有所不同。
@ObservedObject
@ObservedObject 用于观察一个已经存在的对象,通常是你的视图模型(ViewModel)或其他 ObservableObject。这个对象通常是在视图之外创建的,并作为属性传递给视图。@ObservedObject 不会自动创建或销毁它观察的对象;它只是观察对象的状态变化,并在状态变化时触发视图的重新渲染。
使用 @ObservedObject 的一个常见场景是,当你有一个跨多个视图共享的状态或业务逻辑时。在这种情况下,你可能会在视图控制器或应用的其他部分创建和管理这个对象,然后将它传递给需要观察其变化的视图。
@StateObject
@StateObject 用于创建和管理一个 ObservableObject 的生命周期。当你使用 @StateObject 时,SwiftUI 会自动为你创建和销毁这个对象。这个对象通常只在当前视图的生命周期内存在。与 @ObservedObject 不同,@StateObject 通常用于封装仅在当前视图内使用的状态和业务逻辑。
使用 @StateObject 的一个常见场景是,当你有一个与特定视图紧密相关的状态或业务逻辑时。例如,一个表示用户输入的表单视图可能会使用 @StateObject 来管理表单的状态和验证逻辑。
总结
使用 @ObservedObject 当你的对象是在视图之外创建和管理的,并且你需要在多个视图之间共享这个对象的状态或业务逻辑。
使用 @StateObject 当你的对象仅在当前视图内使用,并且你希望 SwiftUI 自动管理这个对象的生命周期。
在选择使用哪个属性包装器时,关键是理解你的视图和对象之间的关系,以及你希望如何管理这些对象的生命周期。

什么时候使用EnvironmentObject

在 SwiftUI 中,@EnvironmentObject 是一个强大的属性包装器,它允许你在整个视图层级中传递和共享一个遵循 ObservableObject 协议的对象,而不需要通过视图之间的层层传递。通过 @EnvironmentObject,你可以轻松地将数据从一个视图传递到另一个视图,优化应用程序的数据管理。
当一个对象的属性使用 @Published 标注时,任何依赖于该对象的视图都会在属性值发生变化时收到通知并重新渲染。这意味着,只要对象在视图层次结构的某个顶级位置被设置到环境中,任何子视图都可以通过 @EnvironmentObject 访问到该对象,并对其中 @Published 属性的变化做出响应。
@EnvironmentObject 的使用场景通常涉及需要在多个视图层级间共享的状态或数据。例如,在一个包含多个子视图的复杂界面中,你可能希望共享一个包含用户认证状态、应用设置或其他跨视图数据的对象。通过使用 @EnvironmentObject,你可以将这个对象注入到应用程序的环境中,使得它可以在整个应用程序范围内被访问和共享。
需要注意的是,环境对象的存在期一般比单个视图更长,因此它们通常用于存储那些在整个应用程序或视图层级中都需要访问的数据。相比之下,@StateObject 通常用于封装仅在当前视图内使用的状态和业务逻辑,其生命周期由 SwiftUI 自动管理。
总结来说,@EnvironmentObject 在 SwiftUI 中是一个非常有用的工具,它简化了数据在视图层级间的传递和共享,从而提高了代码的可读性和可维护性。


http://www.niftyadmin.cn/n/5431403.html

相关文章

Qt按回车键实现确定/发送按钮功能

构造函数中,添加如下代码 connect(ui->lineEdit,SIGNAL(returnPressed()),ui->pushButton_send, SIGNAL(clicked()),Qt::UniqueConnection) 当光标在lineEdit上时,输入完毕直接按回车键(大/小都可以), //就会…

智慧城市物联网建设:提升城市管理效率与居民生活品质

目录 一、智慧城市物联网建设的意义 1、提升城市管理效率 2、改善居民生活品质 3、促进城市可持续发展 二、智慧城市物联网建设面临的挑战 1、技术标准与互操作性问题 2、数据安全与隐私保护问题 3、投资与回报平衡问题 三、智慧城市物联网建设的实施策略 1、制定统一…

Web 服务器-Tomcat

文章目录 Web服务器一、Tomcat简介二、基本使用三、在IDEA中创建Maven Web项目四、在IDEA中使用Tomcat Web服务器 一、Tomcat简介 二、基本使用 三、在IDEA中创建Maven Web项目 四、在IDEA中使用Tomcat

成功解决RuntimeError: OpenSSL 3.0‘s legacy provider failed to load

报错 RuntimeError: OpenSSL 3.0s legacy provider failed to load. This is a fatal error by default, but cryptography supports running without legacy algorithms by setting the environment variable CRYPTOGRAPHY_OPENSSL_NO_LEGACY. If you did not expect this er…

JavaParser的快速介绍

开发的工作主要是写代码, 有考虑过使用代码写代码, 使用代码分析和改进代码吗? JavaParser 就可以帮你用来处理Java 代码的这些功能。 Java Parser 的介绍 Java Parser是一个用于解析和分析Java源代码的开源工具。它提供了一个API接口&…

android studio的布局没有提示之SDK不匹配

我新建了一个项目,然后突然发现布局没有提示了: 我看了下我的build.gradle 我直接修改compileSdkVersion为30就能正常使用了

后端程序员入门react笔记(七)- React路由

什么是前端路由 现代的前端页面大多是SPA(单页面应用程序), 也就是只有一个HTML页面的程序,这样用户体验好,服务器压力小,所以更受欢迎。但是一个页面可能有很多功能,比如一个页面,可能会有导航栏&#xf…

【Qt问题】解决UI设计显示和运行显示界面大小不一致问题

问题描述: 在我自己第一次用Qt Creator的时候,发现老师的每次ui界面是多大,运行出来的窗口就是多大,而我自己的每次大小都对不上,所以我每次都要去手动调整窗口大小,非常痛苦。 经过多方查找发现这是由于…