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

SwiftUI未更新子视图中的ObservedObject

SwiftUI是一种用于构建用户界面的现代化框架,它是苹果公司推出的一种声明式UI编程范式。在SwiftUI中,我们可以使用ObservedObject属性包装器来创建可观察的对象,以便在视图中监视和响应数据的变化。

当使用ObservedObject包装器包装一个对象时,SwiftUI会自动监视该对象的属性,并在属性发生变化时更新视图。然而,有时候我们可能会遇到一个问题,即在子视图中更新ObservedObject对象的属性时,父视图并不会自动刷新。

要解决这个问题,我们可以使用@StateObject属性包装器来包装ObservedObject对象。@StateObject包装器会在整个视图层次结构中保持唯一的对象实例,并确保在子视图中更新ObservedObject属性时,父视图也会自动刷新。

下面是一个示例代码,演示了如何在SwiftUI中更新子视图中的ObservedObject:

代码语言:txt
复制
import SwiftUI

class DataModel: ObservableObject {
    @Published var value: Int = 0
}

struct ContentView: View {
    @StateObject var dataModel = DataModel()

    var body: some View {
        VStack {
            Text("Value: \(dataModel.value)")
            
            ChildView(dataModel: dataModel)
            
            Button("Increment") {
                dataModel.value += 1
            }
        }
    }
}

struct ChildView: View {
    @ObservedObject var dataModel: DataModel
    
    var body: some View {
        Text("Child Value: \(dataModel.value)")
    }
}

在上面的示例中,我们创建了一个DataModel类,并使用@Published属性包装器将value属性标记为可观察的。然后,在ContentView中,我们使用@StateObject包装器创建了一个dataModel对象,并将其传递给ChildView。在ChildView中,我们使用@ObservedObject包装器将dataModel对象标记为可观察的。

当点击Increment按钮时,dataModel的value属性会增加1。由于我们在ChildView中使用了@ObservedObject包装器,所以当value属性发生变化时,ChildView会自动刷新,并更新显示的文本。

推荐的腾讯云相关产品:腾讯云云服务器(CVM),产品介绍链接地址:https://cloud.tencent.com/product/cvm

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

相关·内容

StateObject 与 ObservedObject

本文将介绍两者间异同,原理以及注意事项。访问我博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...会驱动其所属视图进行更新。...例如,在某些情况下,开发者需要父视图不断地生成全新可观察对象实例传递给视图。但由于图中使用了 StateObject ,它只会保留首次传入实例强引用,后面传入实例都将被忽略。...尽量使用 @StateObject var testObject = TestObject() 这样不容易出现歧义表达代码轻量化视图中使用引用类型构造方法无论使用 ObservedObject 还是...StateObject 抑或不添加属性包装器,在视图中声明类实例,都会随着视图描述实例创建而一遍遍地被多次创建。

2.4K20

避免 SwiftUI 视图重复计算

_value 中,此时,使用 Stae 包装变量值没有被保存在 SwiftUI 托管数据池中,并且 SwiftUI 也尚未在属性图中将其作为 Source of Truth 与视图关联起来。...与 @StateObject 最大区别是,ObservedObject 并不会在 SwiftUI 托管数据池中保存引用对象实例( @StateObject 会将实例保存在托管数据池中 ),仅会在属性图中创建视图与视图类型实例中引用对象...与符合 DynamicProperty 协议属性包装器主动驱动视图更新机制不同,SwiftUI更新视图时,会通过检查视图实例是否发生变化( 绝大多数都由构造参数值变化导致 )来决定对子视图更新与否...这是因为,我们将 Student 类型作为参数传递给了视图,SwiftUI 在比对实例时候,并不会关心子视图中具体使用了 student 中哪个属性,只要 student 发生了变化,那么就会重新计算...为了解决这个问题,我们应该调整传递给视图参数类型和内容,仅传递视图需要数据。

9.2K81

SwiftUI @State @Published @ObservedObject 深入理解和使用

1.SwiftUI 是Apple 新出面向未来、跨多端解决方案、声明式编程 SwiftUI最新版本 2.0 但是需要 IOS 14 支持,多数现在还用是IOS 13 所以很多不完善东西都用SwiftUIX...提示:在SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储在一个视图中简单属性而设计。...@Published + @ObservedObject 介绍 @Published是SwiftUI最有用包装之一,允许我们创建出能够被自动观察对象属性,SwiftUI会自动监视这个属性,一旦发生了改变...因为SwiftUI更新数据前提是触发 第一层 绑定对象 wrapperModel下属性(字段)发生更新才会调用视图层更新数据 但是 第一次下绑定对象还绑定了 @ObservedObject 或者其他类型对象呢...{ /// /// 注意 /// 接收 子类model 时候要用 @ObservedObject 不能用 @Published /// 因为SwiftUI 更新机制是当前对象有

2.9K10

SwiftUI 状态管理系统指南

视图内部状态,并在该状态被改变时自动使视图更新。...,绑定不仅仅局限于单一内置值,比如字符串或整数,而是可以用来将任何Swift值绑定到我们一个视图中。...作为一个例子,让我们更新上面定义ProfileView——通过将管理User模型责任从视图本身转移到一个新、专门对象中。...把StateObject和ObservedObject看作是State和Binding参考类型,或者SwiftUI版本强和弱属性。...尽管在一个父视图和它一个视图之间创建绑定通常很容易,但在整个视图层次结构中传递某个对象或值可能相当麻烦——而这正是环境变量旨在解决问题类型。 有两种主要方法来使用SwiftUI环境。

5K20

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

如果我们使用@ObservedObject,则需要将我们对象从每个视图传递到下一个视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...环境对象一个​​复杂性是其对象构成,因为视图可以访问环境对象取决于其父视图。...Apple已将此工作表情况描述为他们想要修复错误,因此我希望在以后对SwiftUI更新中会有所改变。...在向您展示一些代码之前,还有最后一件事:环境对象使用您已经学过ObservableObject协议,SwiftUI将自动确保共享同一环境对象所有视图在更改时都会更新。...当然,我们可以在单个视图中表示出来,但是通过这种方式,您可以确切地看到使用环境对象时通信无缝性。 现在,这是最聪明部分。

9.5K20

@State 研究

每当视图在创建或解析时,都会为该视图和与该视图中使用状态数据之间创建一个依赖关系,每当状态信息发生变化时,有依赖关系视图则会马上反应出这些变化并重绘。...SwiftUI中提供了诸如 @State ObservedObject EnvironmentObject等来创建应对不同类型、不同作用域状态形式。...但至少我们可以大概了解@State是如何让我们在视图中修改、绑定数据。 什么时候建立依赖? 我目前无法找到任何关于SwiftUI建立依赖更具体资料或实现线索。...由此可以推测,SwiftUI对于ObservedObject采用了不同依赖创建时机,只要声明,无论body里是否有需要,在ObservableObjectobjectWillChange产生send...因此ObservedObject很可能是在初始化MainView时候建立依赖关系。 之所以花气力来判断这个问题,因为这两种创建依赖时机不同会导致View更新效率巨大差异。

2.9K20

ObservableObject研究

,数据流并非完全单向•在部分视图中可以结合SwiftUI通过其他包装属性如@FetchRequest等将状态局部化 后两项是利用SwiftUI特性,也可以不采用,完全采用单向数据流方式 基于以上方法...在SwiftUI下开发,无论是主观还是客观都需要你将View表述精细化,用更多View来组成你最终视图,而不是把所有的代码都尽量写在同一个View上。...众多依赖将使我们无法享受到SwiftUI提供View更新优化机制。...有关View优化问题大家可以参考 《SwiftUI编程思想》一书中View更新机制介绍,另外swiftui-lab上也有探讨Equality文章。...来说,尽管仍有无效动作,但整体效率影响并不大,但是如果你appState里面内容较多,更新较频繁,View更新压力会陡然增大。

2.4K60

SwiftUI 与 Core Data —— 安全地响应数据

SwiftUI 与 Core Data —— 问题[1]SwiftUI 与 Core Data —— 数据定义[2]SwiftUI 与 Core Data —— 数据获取[3]可以在 此处[4] 获取演示项目...Todo 代码访问我博客 www.fatbobman.com[5] 可以获得更好阅读体验以及最新更新内容。...不过,通常我们在图中,会用 ObservedObject 来标注托管对象实例,以实时响应数据变动,因此如果我们将代码调整成正常编写模式就能看出问题所在了:struct Cell:View {...我们为视图传递都是托管对象实例本身( AnyConvertibleValueObservableObject 也是对托管对象实例二度包装 )。...通过在视图中获取值类型数据对应托管对象实例,便可以既保证安全,又保持了响应实时性。为了演示方便,仍以普通 SwiftUI 数据流举例:@State var item: ItemValue?

3.2K20

如何让 SwiftUI 列表变得更加灵活

前言 List 可能是 SwiftUI 附带内置视图中最常用一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图”用户界面。...使用新速记语法 让我们从一个很小特性开始,这是一个非常受欢迎变化,可以使用类似 enum 速记语法来引用 SwiftUI 附带任何内置 ListStyle 类型。...为了演示这种情况,我们在 List 中嵌套一个 ForEach (因为在 SwiftUI 中,列表变化一版都是由 ForEach 触发,而不是由 List 触发)。...下拉刷新 就我个人而言,下拉刷新在我 SwiftUI 功能请求列表中非常重要,所以我很高兴看到今年版本增加了对这种非常常见 UI 范式内置支持。...可定制分隔符 自从引入 SwiftUI 以来,开发者们有一个非常普遍要求,提供一个 API ,用于隐藏或以其他自定义实现列表中每个 item 之间默认分隔符。

4.8K41

TCA - SwiftUI 救星?(一)

虽然 SwiftUI 中提供了诸多状态管理关键字或属性包装 (property wrapper),比如 @State、@ObservedObject 等,但是你很难说官方 SwiftUI 教程里关于数据传递...我们类比一下这些步骤在 SwiftUI实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject @Published 发生变化时,SwiftUI...如果让 View 直接观察整个 Store,在其中某个状态发生变化时,SwiftUI 将会要求所有对 Store 进行观察 UI 更新,这会造成所有的 view 都对 body 进行重新求值,是非常大浪费...比如下图中,State 2 发生了变化,但是并不依赖 State 2 View 1 和 View 1-1 只是因为观察了 Store,也会由于 @ObservedObject 特性,重新对 body...在 SwiftUI 中,body 刷新是 SwiftUI 运行时通过 @ObservedObject 属性包装所提供特性。现在这部分内容被包含在了 WithViewStore 中。

3.2K30

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

访问我博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...A:EnvironmentObject 是一个很好工具。如果你不想让父视图也被更新,可以在创建对象时不使用 @StateObject 或 @ObservedObject 。...场景内容视图定义了场景创建窗口中视图内容,但场景本身定义了应用程序整体结构。SwiftUI 4.0 中,WindowGroup 获得了相当大更新,真正具备了开发 macOS 应用能力。...使用它们应该只创建一个实例,然后可以在图中读取。这应该不会增加内存使用( 如果有的话,请提出反馈 )。如果你向你模型对象追加越来越多数据,你可能会增加内存使用,这是很正常。...我在同一个上下文中创建一个新托管对象,并希望将这个对象发送到一个新窗口。

12.2K20

SwiftUI 与 Core Data —— 数据定义

访问我博客 www.fatbobman.com[1] 可以获得更好阅读体验以及最新更新内容。...代码仍在更新中,可能会出现与文章中不完全一致情况。http://mpvideo.qpic.cn/0b2euiaasaaakaahn24eznrvbiwdbgraacia.f10002.mp4?...遗憾是,托管对象对于以值类型为主 SwiftUI 来说并不算友好,因此,不少开发者都会在视图中将托管对象实例转换成一个结构体实例以方便接下来操作( 如何在 Xcode 下预览含有 Core Data...托管对象其他优势在视图中用结构体直接表示数据固然方便,但我们仍不能忽略托管对象其他优势。..._wrappedValue = wrappedValue }}现在,在 SwiftUI 图中,MockGroup 将具备与 C_Group 几乎一样能力,唯一不同是,它是通过一个 TodoGroup

2.4K40

如何在 Swift 中取消一个后台任务

本文演示了如何明确地取消一个任务,并展示了任务是如何自动取消。 该代码建立在在 Swift 中使用 async let 并行运行后台任务中编写AsyncLetApp之上。...模拟文件下载循环根据两个条件从 for 循环更新为 while 循环: 取消标志值是 false 文件正在下载 这解决了这个问题,但是有一个额外标志来取消下载似乎太多余了。...Task 创建一个状态属性,并在下载按钮操作图中将任务分配给该属性。...此方法仍然使用Task状态属性。它被分配给下载按钮中 downloadFiles 函数,任务通过视图中取消按钮取消。...中任务 在 SwiftUI 中取消和恢复后台任务 结论 在异步编程中,重要是停止任何不需要后台任务以节省资源并避免后台任务干扰应用程序任何不良副作用。

2.7K30

WWDC 23 之后 SwiftUI 有哪些新功能

Observation 框架为我们提供了 Observable 协议,必须使用它来允许 SwiftUI 订阅更改并更新视图。...在之前 SwiftUI 框架版本中,应该使用 @ObservedObject 属性包装器来订阅更改。现在不需要了,因为 SwiftUI 视图会自动跟踪符合 Observable 协议类型更改。...每当用户滚动视图时,它会通过设置第一个可见视图标识来更新绑定。...还可以通过编程方式滚动到任何视图,但是,应该使用 scrollTargetLayout 视图修饰符来告诉 SwiftUI 框架在哪里查找标识以更新绑定。...它允许在滚动视图中启用分页。 搜索 与搜索相关视图修饰符也有一些很好新增功能。例如,可以通过编程方式聚焦到搜索字段。

31420

SwiftUI + Core Data App 内存占用优化之旅

、惰性视图中子视图生命周期、托管对象惰值特性以及持久化存储协调器行缓存等内容有更多了解。...在正常情况下( 惰性容器中仅包含一个 ForEach ,且视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内视图实例,并对其 body 进行求值( 渲染 )。...当视图进入惰性容器可视区域时,SwiftUI 会调用它 onAppear 闭包,视图退出可视区域时,会调用 onDisappear 闭包。...同优化过代码一样,随着数据量增大,内存占用也将随之提高。在 400 条记录情况下,滚动到底部,内存占用值差不多是 1.75 GB。...根据上述原理,我们将尝试如下过程: 在 onAppear 闭包中,通过私有上下文创建一个 Picture 对象 将 data 属性数据转换成 Image,并保存在视图中一个 Source of truth

2.4K40

SwiftUI + Core Data App 内存占用优化之旅

、惰性视图中子视图生命周期、托管对象惰值特性以及持久化存储协调器行缓存等内容有更多了解。...在正常情况下( 惰性容器中仅包含一个 ForEach ,且视图没有使用 id 添加显式标识 ),惰性容器仅会创建当前可见范围内视图实例,并对其 body 进行求值( 渲染 )。...当视图进入惰性容器可视区域时,SwiftUI 会调用它 onAppear 闭包,视图退出可视区域时,会调用 onDisappear 闭包。...同优化过代码一样,随着数据量增大,内存占用也将随之提高。在 400 条记录情况下,滚动到底部,内存占用值差不多是 1.75 GB。...根据上述原理,我们将尝试如下过程: 在 onAppear 闭包中,通过私有上下文创建一个 Picture 对象 将 data 属性数据转换成 Image,并保存在视图中一个 Source of truth

1.2K10
领券