Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >SwiftUI:“动态列表与组”在更改`@Published`‘属性时未刷新

SwiftUI:“动态列表与组”在更改`@Published`‘属性时未刷新
EN

Stack Overflow用户
提问于 2019-11-12 03:20:40
回答 2查看 943关注 0票数 2

我试图在中创建一个SwiftUI动态分组列表,如果我更改标记为@已发布的内部ForEach的集合,则除非我转到另一个屏幕/工作表,否则UI中看不到更改。我不明白我所做的是正确的还是不正确的错误,关于“SwiftUI中的动态分组列表”这一主题的资源非常有限,所以我希望您能指出正确的方向。

这是我的设置:

型号:

代码语言:javascript
代码运行次数:0
复制
class Product: Identifiable, ObservableObject {
    let id = UUID()
    var name: String

    init(name: String) {
        self.name = name
    }
}

class Category: Identifiable, ObservableObject {
    let id = UUID()
    @Published var items = [Product]()
    var categoryName = ""
}

class Categories: ObservableObject {
    @Published var items = [Category]()
}

和观点

代码语言:javascript
代码运行次数:0
复制
struct ProductListView: View {
    @ObservedObject var categories: Categories = Categories()


    var body: some View {
            List {
                ForEach(categories.items) { category in
                    Section(header: Text(category.categoryName)) {
                        ForEach(category.items) { item in
                            Text(item.name)
                        }
                    }
                }
            }
            .listStyle(GroupedListStyle())
    }

    func appendProduct() {
        let product = Product(name: self.$name.wrappedValue, quantity: 1, complated: false)
        let basicCategory = "Generic"
        let existingCategory = self.categories.items.filter({$0.categoryName == basicCategory}).first
        if (existingCategory?.items != nil) {

            // Changes here do not refresh the UI 
            existingCategory?.items.append(product)
        } else {
            let category = Category()
            category.categoryName = basicCategory
            category.items.append(product)
            self.categories.items.append(category)
        }
    }
}

当我附加到Category (existingCategory?.items.append(product))的项时,除非我使用导航或使用.sheet(),否则UI不会被更新

有人知道这里出了什么问题吗?我对Swift和SwfitUI非常陌生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-12 04:42:46

您的视图只是在观察categories,因此只有对categories的直接更改才会导致视图的重绘。

这就是为什么self.categories.items.append(Category())总是会导致视图重绘,但existingCategory?.items.append(product)不会。

existingCategory?.items.append(product)只是向categories类别元素中的一个添加元素,但类别元素仍然是相同的,因此在直接到观察到的categories的地方没有更改。

你可以试试这个:

self.$categories.items[0].items.wrappedValue.append(product)

这也会导致视图的重绘,因为您直接在categories绑定上操作。

票数 2
EN

Stack Overflow用户

发布于 2022-03-10 06:07:07

在Swift中,类别和产品应该是一个结构。

这为您提供了值语义,这就是SwiftUI用于检测更改的内容。也就是说,对产品的更改被检测为对类别的更改,这被检测为对@Published项的更改,SwiftUI正在观察这些更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58817625

复制
相关文章
架构之路 (五) —— VIPER架构模式(一)
VIPER架构模式是MVC或MVVM的另一种选择。虽然SwiftUI和Combine框架创建了一个强大的组合,可以快速构建复杂的ui和在应用程序中移动数据,但它们也面临着各自的挑战和对架构的看法。
conanma
2021/09/04
17.6K0
SwiftUI @State @Published @ObservedObject 深入理解和使用
因为SwiftUI View 采用的是结构体,当创建想要更改属性的结构体方法时,我们需要添加mutating关键字,例如:
沙漠尽头的狼
2021/12/01
3.4K0
SwiftUI-数据流
SwiftUI中的界面是严格数据驱动的:运行时界面的修改,只能通过修改数据来间接完成,而不是直接对界面进行修改操作。
YungFan
2020/02/18
10.2K1
SwiftUI-数据流
深度解读 Observation —— SwiftUI 性能提升的新途径
在 WWDC 2023 中,苹果介绍了 Swift 标准库中的新成员:Observation 框架。它的出现有望缓解开发者长期面临的 SwiftUI 视图无效更新问题。本文将采取问答的方式,全面而详尽地探讨 Observation 框架,内容涉及其产生原因、使用方法、工作原理以及注意事项等。
东坡肘子
2023/07/08
6200
深度解读 Observation —— SwiftUI 性能提升的新途径
避免 SwiftUI 视图的重复计算
随着近年来有关 SwiftUI 的文章与书籍越来越多,开发者应该都已经清楚地掌握了 —— “视图是状态的函数” 这一 SwiftUI 的基本概念。每个视图都有与其对应的状态,当状态变化时,SwiftUI 都将重新计算与其对应视图的 body 值。
东坡肘子
2022/08/03
9.3K0
避免 SwiftUI 视图的重复计算
架构之路 (七) —— iOS App的SOLID原则(一)
要编写出色的应用程序,您不仅需要提出一个好主意,还需要考虑未来。快速有效地适应、改进和扩展应用程序功能的灵活性至关重要。无论您是在团队中工作还是独自工作,从长远来看,您编写和组织代码的方式将对维护您的代码产生巨大影响。这就是 SOLID 原则的用武之地。
conanma
2021/09/04
4.7K0
Ask Apple 2022 与 SwiftUI 有关的问答(上)
Ask Apple 为开发者与苹果工程师创造了在 WWDC 之外进行直接交流的机会。本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为上篇。
东坡肘子
2022/12/16
12.3K0
Ask Apple 2022 与 SwiftUI 有关的问答(上)
ObservableObject研究
我是在去年阅读王巍写的《SwiftUI 与 Combine 编程》才第一次接触到单一数据源这一概念的。
东坡肘子
2022/07/28
2.4K0
ObservableObject研究
WWDC 23 之后的 SwiftUI 有哪些新功能
WWDC 23 已经到来,SwiftUI 框架中有很多改变和新增的功能。在本文中将主要介绍 SwiftUI 中数据流、动画、ScrollView、搜索、新手势等功能的新变化。
Swift社区
2023/09/06
4040
WWDC 23 之后的 SwiftUI 有哪些新功能
Ask Apple 2022 与 SwiftUI 有关的问答(下)
Ask Apple 为开发者与苹果工程师创造了在 WWDC 之外进行直接交流的机会。本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为下篇。
东坡肘子
2022/12/16
14.8K0
Ask Apple 2022 与 SwiftUI 有关的问答(下)
从前端视角看 SwiftUI
我对 iOS 开发、手机开发、SwiftUI 开发经验有限,若有理解错误的部分欢迎指正。
Swift社区
2022/02/09
3.5K0
在 SwiftUI 中创建自适应的程序化导航方案
随着苹果对 iPadOS 的不断投入,越来越多的开发者都希望自己的应用能够在 iPad 中有更好的表现。尤其当用户开启了台前调度( Stage Manager )功能后,应用对不同视觉大小模式的兼容能力就越发显得重要。本文将就如何创建可自适应不同尺寸模式的程序化导航方案这一内容进行探讨。
东坡肘子
2022/12/16
4.3K0
在 SwiftUI 中创建自适应的程序化导航方案
解析SwiftUI布局细节(三)地图的基本操作
前面的几篇文章总结了怎样用 SwiftUI 搭建基本框架时候的一些注意点(和这篇文章在相同的分类里面,有需要了可以点进去看看),这篇文章要总结的东西是用地图数据处理结合来说的,通过这篇文章我们能总结到的点有下面几点:
Mr.RisingSun
2021/01/07
2.1K0
[Oracle ASM全解析]更改ASM磁盘组
我们可以使用alter命令来修改磁盘组,例如新增,删除,修改大小磁盘等操作,Oracle建议同一个语句中同时进行多个操作
bsbforever
2020/08/19
1.8K0
为自定义属性包装类型添加类 @Published 的能力
本文将对 @Published 与符合 ObservableObject 协议的类实例之间的沟通机制做以介绍,并通过三个示例:@MyPublished( @Published 的仿制版本 )、@PublishedObject(包装值为引用类型的 @Published 版本)、@CloudStorage(类似 @AppStorage ,但适用于 NSUbiquitousKeyValueStore ),来展示如何为其他的自定义属性包装类型添加可访问包裹其的类实例的属性或方法的能力。
东坡肘子
2022/07/28
3.4K0
为自定义属性包装类型添加类 @Published 的能力
SwiftUI 与 Core Data —— 数据获取
本文中我们将探讨在 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。由于本文会涉及大量 前文[1] 中介绍的技巧和方法,因此最好一并阅读。
东坡肘子
2022/12/16
4.7K0
SwiftUI 与 Core Data —— 数据获取
SwiftUI 动画进阶 — Part4:TimelineView
前三篇高级 SwiftUI 动画系列是作者在 WWDC 2021 之前实战总结的内容。对 2021 年 WWDC 介绍的 TimelineView 和 Canvas 感到激动。这开启了一个全新的可能性,笔者将试图在这一部分和下一部分的系列中阐释这些可能性。
Swift社区
2022/04/04
3.8K0
SwiftUI 动画进阶 — Part4:TimelineView
【译】SwiftUI中使用ForEach枚举列表
因此我们需要使用另外的ForEach初始化方法init(_:id:content:) 来使用key path显示的指定元素的ID。这里例子中是\.1.id,其中.1表示元组中第二个元素person,.id自然是person的唯一值key。
小刀c
2022/09/21
7820
【译】SwiftUI中使用ForEach枚举列表
用Async/Await重建SwiftU的Redux-like状态容器
经过两年多的时间,SwiftUI发展到当前的3.0版本,无论SwiftUI的功能还是Swift语言本身在这段时间里都有了巨大的提升。是时候使用Async/Await来重构我的的状态容器代码了。
东坡肘子
2022/07/28
1.9K0
用Async/Await重建SwiftU的Redux-like状态容器
SwiftUI 4.0 的全新导航系统
长久以来,开发者对 SwiftUI 的导航系统颇有微词。受 NavigationView 的能力限制,开发者需要动用各种技巧乃至黑科技才能实现一些本应具备基本功能(例如:返回根视图、向堆栈添加任意视图、返回任意层级视图 、Deep Link 跳转等 )。SwiftUI 4.0( iOS 16+ 、macOS 13+ )对导航系统作出了重大改变,提供了以视图堆栈为管理对象的新 API ,让开发者可以轻松实现编程式导航。本文将对新的导航系统作以介绍。
东坡肘子
2022/07/28
10.4K0
SwiftUI 4.0 的全新导航系统

相似问题

@Published未更新,状态问题?- SwiftUI

111

来自@Published属性的SwiftUI动画从视图外部更改

123

@Published对象数组中的计算属性未更新SwiftUI视图

154

SwiftUI - @Published属性未从协调器更新视图

115

SwiftUI:基于@Published变量对列表进行排序

122
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档