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

为什么SwiftUI ObservedObject不能在列表行中工作?

SwiftUI中的ObservedObject不能直接在列表行中工作的原因是,ObservedObject是一种用于在视图之间共享数据的属性包装器。在列表中,每个行都是独立的视图实例,它们具有自己的生命周期。当列表行被重新加载或复用时,ObservedObject实例会被重新创建,导致数据丢失或不一致。

为了解决这个问题,可以使用ForEach视图和Identifiable协议来创建列表行,并将ObservedObject作为参数传递给行视图。这样,每个行视图都可以共享相同的ObservedObject实例,确保数据的一致性。

以下是一个示例代码:

代码语言:txt
复制
struct ContentView: View {
    @ObservedObject var dataModel = DataModel()
    
    var body: some View {
        List {
            ForEach(dataModel.items) { item in
                RowView(item: item)
            }
        }
    }
}

struct RowView: View {
    @ObservedObject var item: Item
    
    var body: some View {
        Text(item.name)
    }
}

class DataModel: ObservableObject {
    @Published var items: [Item] = []
    
    init() {
        // 初始化数据
    }
}

struct Item: Identifiable {
    let id = UUID()
    let name: String
}

在这个示例中,ContentView视图使用@ObservedObject属性包装器来创建一个DataModel实例。然后,使用ForEach视图和Identifiable协议来遍历DataModel中的items数组,并将每个item传递给RowView视图。RowView视图使用@ObservedObject属性包装器来观察item对象的变化,并显示item的名称。

这样,无论列表行如何重新加载或复用,ObservedObject都会保持一致,并且可以正确地更新和显示数据。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云开发者平台:https://cloud.tencent.com/developer
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb-for-mysql
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ai
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iotexplorer
  • 移动应用开发平台(Serverless Framework):https://cloud.tencent.com/product/sls
  • 对象存储(COS):https://cloud.tencent.com/product/cos
  • 区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙解决方案:https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

StateObject 与 ObservedObject

StateObject 是在 SwiftUI 2.0 才添加的属性包装器,它的出现解决了在某些情况下使用 ObservedObject 视图会出现超预期的问题。...订阅 与 Cancellable在 Combine ,当使用 sink 或 assign 来订阅某个 Publisher 时,必须要持有该订阅关系,才能让这个订阅正常工作,订阅关系被包装成 AnyCancellable...在 @StateObject 研究[4] 一文,展示了因错误使用 ObservedObject 而引发灵异现象的代码片段出现这种情况是因为一旦,在视图的存续期中,SwiftUI 创建了新的实例并使用了该实例...StateObject 抑或添加属性包装器,在视图中声明的类实例,都会随着视图描述实例的创建而一遍遍地被多次创建。...不在它的构造方法引入无关的操作可以极大地减轻系统的负担。对于数据的准备工作,可以使用 onAppear 或 task ,在视图加载时进行。

2.4K20
  • SwiftUI-数据流

    SwiftUI的界面是严格数据驱动的:运行时界面的修改,只能通过修改数据来间接完成,而不是直接对界面进行修改操作。...开发者不需要关心数据和视图的状态同步工作,只需要关心数据的获取以及逻辑处理,使用起来非常简单,大大提高了开发效率。...@Binding 主要有两个作用: 在持有数据源的情况下,任意读取。 从 @State 获取数据应用,并保持同步。...使用@EnvironmentObject,SwiftUI 将立即在环境搜索正确类型的对象。如果找不到这样的对象,则应用程序将立即崩溃。...最终再次呈现给用户,等待下次界面操作 注意 在 SwiftUI ,开发者只需要构建一个视图可依赖的数据源,保持数据的单向有序流转即可,其他数据和视图的状态同步问题 SwiftUI 帮你管理,所以 ViewController

    10.2K20

    @StateObject 研究

    @StateObject 研究 如想获得更好的阅读体验可以访问我的博客 www.fatbobman.com 为什么要新增@StateObject 在我之前的文章@State研究我们探讨过@State,...在SwiftUI 1.0时代,如果想将引用类型作为source of truth,通常的方法是使用@EnvironmentObject或者 @ObservedObject。...为了能够让开发者更好的掌控代码,同时也保持对于上一版本良好的兼容性,苹果在SwiftUI2.0添加了@StateObject。顾名思义,它是@State的引用类型版本。...三段代码,三种结果,这也就是为什么苹果要新增@StateObject的原因——让开发者可以明确地了解并掌握实例的生命周期,消除不确定性! ObservedObject是否还有存在的必要?...在下一篇文章《SwiftUI2.0 —— 100% SwiftUI app》,我们来进一步探讨。

    1.2K40

    TCA - SwiftUI 的救星?(一)

    可以说,从 iOS 14 开始,SwiftUI 才算逐渐进入了可用的状态。而最近随着公司的项目彻底抛弃 iOS 13,我也终于可以更多地正式在工作中用上 SwiftUI 了。...我们类比一下这些步骤在 SwiftUI 的实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject 的 @Published 发生变化时,SwiftUI...ContentView ,我们直接操作 Counter,而是将它放在一个 Store 。这个 Store 负责把 Counter (State) 和 Action 连接起来。...不出意外,当 WithViewStore 接受的闭包满足 View 协议时,它本身也将满足 View,这也是为什么我们能在 CounterView 的 body 直接用它来构建一个 View 的原因。...在 SwiftUI ,body 的刷新是 SwiftUI 运行时通过 @ObservedObject 属性包装所提供的特性。现在这部分内容被包含在了 WithViewStore

    3.3K30

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

    以及各种库代替,bug也是层出穷 2.下面是鄙人对 @State @Published @ObservedObject 理解,如有不对,还请指出 1....是的,这感觉有点像作弊,你可能想知道为什么我们不使用类-它们可以自由修改。...提示:在SwiftUI存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储在一个视图中的简单属性而设计的。...@Published + @ObservedObject 介绍 @Published是SwiftUI最有用的包装之一,允许我们创建出能够被自动观察的对象属性,SwiftUI会自动监视这个属性,一旦发生了改变...因为SwiftUI更新数据的前提是触发 第一层 绑定的对象 wrapperModel下的属性(字段)发生更新才会调用视图层更新数据 但是 第一次下绑定的对象还绑定了 @ObservedObject 或者其他类型的对象呢

    3.2K10

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

    初版的概念和 API 编写的,下面让我们尝试使用新功能来为我们的列表实现自定义样式,并且使代码更加健壮。...元素绑定和自定义滑动操作 接下来,让我们看看如何将完全自定义的滑动操作添加到列表。...为了演示这种情况,我们在 List 嵌套一个 ForEach (因为在 SwiftUI列表变化一版都是由 ForEach 触发的,而不是由 List 触发的)。...然后,让我们使用另一个新功能,集合元素绑定,让系统自动为我们的 articles 数组的每个元素创建一个可变绑定: struct ArticleList: View { @ObservedObject...可定制的分隔符 自从引入 SwiftUI 以来,开发者们有一个非常普遍的要求,提供一个 API ,用于隐藏或以其他自定义实现列表每个 item 之间的默认分隔符。

    4.9K41

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

    开发者通常会利用这两个调用时机来实现数据准备和善后工作。...这意味着,在惰性容器,视图一经创建,其存续期将与该容器一致( 容器销毁,则视图将始终存续 )。...只有在访问这些托管属性时,Core Data 才会为托管对象进行数据填充( 如果缓存中有,从缓存取;如果没有则将数据从数据库搬运到缓存后再从缓存取 )。...数据的多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示时,实际上在内存至少保存了三份拷贝: 缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片的 SwiftUI...终极优化:私有上下文 + 持有托管对象 思路 在第二轮优化,尽管通过将托管对象转换为惰值解决了一部分内存占用问题,但存在于缓存的数据始终还是无法得到有效清除。

    1.3K10

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

    开发者通常会利用这两个调用时机来实现数据准备和善后工作。...这意味着,在惰性容器,视图一经创建,其存续期将与该容器一致( 容器销毁,则视图将始终存续 )。...只有在访问这些托管属性时,Core Data 才会为托管对象进行数据填充( 如果缓存中有,从缓存取;如果没有则将数据从数据库搬运到缓存后再从缓存取 )。...数据的多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示时,实际上在内存至少保存了三份拷贝: 缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片的 SwiftUI...终极优化:私有上下文 + 持有托管对象 思路 在第二轮优化,尽管通过将托管对象转换为惰值解决了一部分内存占用问题,但存在于缓存的数据始终还是无法得到有效清除。

    2.4K40

    避免 SwiftUI 视图的重复计算

    get } // 在将视图加载到视图树时,调用此方法,完成关联工作 public static func _makeProperty(in buffer: inout _DynamicPropertyBuffer...当 SwiftUI 将视图从视图树上删除时,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法在视图的构造函数,更改 State 包装的变量值?...与 @StateObject 最大的区别是,ObservedObject 并不会在 SwiftUI 托管数据池中保存引用对象的实例( @StateObject 会将实例保存在托管数据池中 ),仅会在属性图中创建视图与视图类型实例的引用对象的...其他建议 需要跳跃视图层级时,考虑使用 Environment 或 EnvironmentObject 对于紧密的 State 关系,考虑在同一个视图层级使用多个 EnvironmentObject

    9.3K81

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

    在这篇文章,我们将探讨几个在 SwiftUI 开发中经常使用且至关重要的属性包装器。本文旨在提供对这些属性包装器的主要功能和使用注意事项的概述,而非详尽的使用指南。...@Binding 直接持有数据,而是提供了对其他数据源的读写访问的包装。 它允许 UI 元素直接修改数据,并反映这些数据的变化。...引入 @StateObject 意味着所有相关操作都在主线程上进行( SwiftUI 会隐式为视图添加 @MainActor),包括异步操作。应将需要在非主线程上运行的代码应该从视图代码剥离。...@ObservedObject 持有被观察的实例,不保证其生存期。 @ObservadObject 可以在视图存续期内切换其所关联的实例。...注意事项 在 iOS 13 ,由于没有提供 @StateObject ,此时 @ObservedObject 是唯一选择,可能会因为无法保证实例的存续期而产生 意想不到的结果[12],为了避免类似问题

    32310

    SwiftUI 状态管理系统指南

    前言 SwiftUI与苹果之前的UI框架的区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用它的应用程序管理视图层级的状态。...本周,让我们仔细看看这些属性包装器的每一个,它们之间的关系,以及它们如何构成SwiftUI整体状态管理系统的不同部分。...观察对象 State和Bingding的共同点是,它们处理的是在SwiftUI视图层次结构本身管理的值。...标记为StateObject的属性与ObservedObject的行为完全相同——此外,SwiftUI将确保存储在此类属性的任何对象不会因为框架在重新渲染视图时重新创建新实例而被意外释放: struct...把StateObject和ObservedObject看作是State和Binding的参考类型,或者SwiftUI版本的强和弱属性。

    5.1K20

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

    是否有任何建议用来检测列表选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...不过,在传统的 viewModel 意义上,我建议将视图( 结构本身 )作为视图模型。...这可能会导致一些不好的后果,例如使视图的可重用性降低,并将业务逻辑与 SwiftUI 视图的生命周期挂钩,这将使处理业务逻辑变得更加困难。简而言之,我们建议使用视图作为视图模型。...可以试着把 init 工作转移到 UITabBarController 的 viewDidLoad 。...不是因为它不能工作,而是因为如果你不深入了解 @State 和身份( identity )的工作原理,它的行为就会相当混乱。

    12.3K20

    SwiftUI 创建自适应的程序化导航方案

    因此在 SwiftUI ,掌握两种导航容器的状态表述差异是实现自适应导航方案的关键。...例如:在 A 修改状态 b,B 响应 b 状态;在 B 修改状态 c,C 视图响应状态 c。...不过仅有在前两列通过 List(selection:) 来修改状态时,才能在自动转换的 NavigationStack 表现形式具备程序化导航的能力。方案一对此有进一步的说明。...每周也会对当周博客上的新文章以及在 Twitter 上发布的 Tips 进行汇总,并通过邮件列表的形式发送给订阅者。订阅下方的 邮件列表[8],可以及时获得每周的 Tips 汇总。...[6] Twitter: https://twitter.com/fatbobman[7] Discord 频道: https://discord.gg/ApqXmy5pQJ[8] 邮件列表: https

    4.3K30

    ObservableObject研究

    ,数据流并非完全单向的•在部分视图中可以结合SwiftUI通过的其他包装属性如@FetchRequest等将状态局部化 后两项是利用SwiftUI的特性,也可以采用,完全采用单向数据流的方式 基于以上方法...章节,我们通过了一段代码进行过@State和@ObservedObject对于依赖注入时机的推测。...以Body为单位的优化机制 SwiftUI为了减少View的重绘其实做了大量的工作,它以View的body为单位进行非常深度的优化(body是每个View的唯一入口;View中使用func -> some...SwiftUI在程序编译时便已将所有的View编译成View树,它尽可能的只对必须要响应状态变化的View(@State完美的支持)进行重绘工作。...此时只需把View分解成几个View,即使仍然在同一个文件,Xcode的工作也会立刻正常起来。

    2.4K60

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

    本文将介绍可能在视图中产生严重错误的原因,如何避免,以及在保证视图对数据变化实时响应的前提下如何为使用者提供更好、更准确的信息。由于本文会涉及大量前文中介绍的技巧和方法,因此最好一并阅读。...SwiftUI 与 Core Data —— 问题[1]SwiftUI 与 Core Data —— 数据定义[2]SwiftUI 与 Core Data —— 数据获取[3]可以在 此处[4] 获取演示项目...如今的 Core Data,随着云同步以及持久化存储历史跟踪的普及,数据库的某个数据可能在任意时刻被其他的设备或同一个设备中使用该数据库的其他进程所删除。...由于在 Core Data 模版代码,只使用了一代码来声明次级视图:Text("Item at \(item.timestamp!...订阅下方的 邮件列表[10],可以及时获得每周的 Tips 汇总。

    3.3K20

    为什么从乙方出来的技术人,能在工作 ‘更猛,更持久’?

    俗话说,“阳春三月,春光明媚,一年之计在于春”,但这句话如果用来形容处于春季的技术团队,恐怕会引来一阵虚声。...即便你个人的影响力达到极高的程度,或许也无法在与 “独角兽” 争夺人才的战斗讨得便宜。 该采取什么样的应对措施呢? “拥抱现实,应对现实” ,这是《原则》让我记忆较为深刻的一句话。...为什么 “更猛,更持久” ? 不可否认,有许多企业排斥从 “乙方公司” 出来的小伙伴,甚至根本不看类似的简历。...可是你却永远不在自己的公司工作,又怎么可能有归属感呢?...这时候,也许你就要再重新考虑住处和交通了,因此换工作的可能性会非常大。

    46720
    领券