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

SwiftUI:为什么我的数据的changed属性不刷新界面?

在 SwiftUI 中,@State@ObservedObject 是常用的属性包装器,用于管理视图的状态和数据。如果你发现数据的 changed 属性没有刷新界面,可能是以下几个原因:

基础概念

  1. @State: 用于本地状态,当值改变时,会自动触发视图的重新渲染。
  2. @ObservedObject: 用于观察外部对象的变化,当对象的属性改变时,也会触发视图的重新渲染。

可能的原因及解决方法

1. 数据未正确标记为 @State@ObservedObject

确保你的数据使用了正确的属性包装器。例如:

代码语言:txt
复制
struct ContentView: View {
    @State private var text = "Hello, World!"

    var body: some View {
        VStack {
            Text(text)
            Button("Change Text") {
                self.text = "New Text"
            }
        }
    }
}

2. 数据模型未正确实现 ObservableObject

如果你使用的是 @ObservedObject,确保你的数据模型遵循 ObservableObject 协议,并且使用了 @Published 属性包装器来标记可观察的属性。例如:

代码语言:txt
复制
class DataModel: ObservableObject {
    @Published var text = "Hello, World!"
}

struct ContentView: View {
    @ObservedObject var model = DataModel()

    var body: some View {
        VStack {
            Text(model.text)
            Button("Change Text") {
                self.model.text = "New Text"
            }
        }
    }
}

3. 数据模型未正确传递

确保你在视图之间正确传递了 @ObservedObject。例如:

代码语言:txt
复制
struct ContentView: View {
    @ObservedObject var model = DataModel()

    var body: some View {
        VStack {
            Text(model.text)
            DetailView(model: self.model)
        }
    }
}

struct DetailView: View {
    @ObservedObject var model: DataModel

    var body: some View {
        Button("Change Text") {
            self.model.text = "New Text"
        }
    }
}

4. 数据模型未正确更新

确保你在更新数据时没有出现逻辑错误。例如,如果你在某个闭包中更新数据,确保闭包正确捕获了外部变量。

代码语言:txt
复制
class DataModel: ObservableObject {
    @Published var text = "Hello, World!"

    func updateText() {
        DispatchQueue.main.async {
            self.text = "New Text"
        }
    }
}

5. 使用 @StateObject 替代 @ObservedObject

在某些情况下,使用 @StateObject 可能更合适,特别是在视图的生命周期内需要创建和管理对象时。

代码语言:txt
复制
struct ContentView: View {
    @StateObject private var model = DataModel()

    var body: some View {
        VStack {
            Text(model.text)
            Button("Change Text") {
                self.model.text = "New Text"
            }
        }
    }
}

应用场景

  • 本地状态管理: 使用 @State 管理视图内部的临时状态。
  • 外部数据绑定: 使用 @ObservedObject@StateObject 管理与视图外部的数据源绑定。

示例代码

以下是一个完整的示例,展示了如何正确使用 @State@ObservedObject

代码语言:txt
复制
import SwiftUI

class DataModel: ObservableObject {
    @Published var text = "Hello, World!"
}

struct ContentView: View {
    @State private var localText = "Hello, Local World!"
    @ObservedObject var model = DataModel()

    var body: some View {
        VStack {
            Text(localText)
            Button("Change Local Text") {
                self.localText = "New Local Text"
            }

            Text(model.text)
            Button("Change Model Text") {
                self.model.text = "New Model Text"
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

通过以上方法,你应该能够解决 SwiftUI 中数据变化未刷新界面的问题。

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

相关·内容

Vue 改变数据,页面不刷新的问题

最近在用 element-ui 开发一个网站,使用 table 组件时,发现修改完数据,有时候会延迟一两秒,页面才会发生变化。 ?...看了一下代码,发现修改数据的代码是这样的 // popupData是修改的数据,修改完后,赋值给对应的表格数据 this.tableData[this.currentRow] = this.popupData...注意事项(以下内容摘自官方文档) 由于 JavaScript 的限制,Vue 不能检测以下数组的变动: 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue...'c'] } }) vm.items[1] = 'x' // 不是响应性的 vm.items.length = 2 // 不是响应性的 为了解决第一类问题,以下两种方式都可以实现和 vm.items...$set 实例方法,该方法是全局方法 Vue.set 的一个别名: vm.

3.4K10

为什么我的自动化流程不执行

很多人经常会有这个问题,为什么我的自动化流程不执行。...【下线】,为了保障大家的系统不要产生脏数据,没有上线的流程是不会执行的。...我的流程第二步:请检查自动化流程是否有执行请来到后台【流程日志】,如果运行成功的流程就会显示【执行成功】并有一个【运行id】。...自动化流程执行失败第三步:确认流程是上线状态,但是流程没有执行,为什么?如果流程确认是上线状态,需要确定你的流程是否符合你设定的触发条件,如果没有达到对应的条件,是不会触发的。...,被判断了没有执行【流程执行过程中修改】:在有【延迟执行】的流程上线后,进行修改,会导致后续的流程不执行

1.5K30
  • 我为什么不建议使用框架默认的 DefaultMeterObservationHandler

    我为什么不建议使用框架默认的 DefaultMeterObservationHandler 背景知识 最近,我们升级了 SpringBoot 3.x,并且,升级后,我们全面改造了原来的 Sleuth 以及...指标数据是统计数据,是聚合数据,是一段时间内的数据,而链路追踪数据是实时数据,是每个请求的数据 但是像是链路追踪上报在生产上肯定不能 100% 上报(上报性能,还有成本考虑,以及查询的存储性能有限,成本不能太高...),而是采样上报,这样就会导致链路追数据不全 JFR 是保留详细数据的好选择,保留在本地,只有发生问题需要排查的时候,事后按需获取就行。...--这里放我们自定义的依赖版本属性--> 3.4.4 的 ObservationHandler 改为什么都不做的,对比下: package com.github.hashjang.wwsmbjysymrdo; import io.micrometer.common.KeyValue

    13500

    为什么我的数据不按顺序排序原来如此 | Java Debug 笔记

    我的接口返回的数据顺序总是不固定问题描述====我在开发突发奇想。将表头信息也给查出来一并返回给前端了。但是正因为这一举动却带来嘲讽。...说我的接口顺序不对问题定位====首先说明下这个问题是刚入行时遇到的。当时很是困惑,当然啦现在看来真的是贻笑大方了。刚入行那会一直都是使用Mybatis 框架实现数据的获取的。...突然接到一个需求是要求将数据列按照一定顺序返回。前端直接按照我返回的顺序进行渲染。刚接到需求觉得很简单,将数据依次写入就行了。关于具体需求我们就不深究了。下面梳理下当时发现问题及解决的一个过程吧。...决定一探究竟为什么LinkedHashMap 可以实现按照写入顺序排序。通过结构图我们清楚看到他是HashMap的子类。所以他的存储结构和HashMap基本上是一样的。...在每次通过HashMap put进数据之后会将当前添加进来的数据和上次添加的node进行链表关联。这样就使其都在一条链上我们上面添加的数据最终其内部一个结构图如下当然内部会有一个默认的节点作为头结点。

    31510

    深度解读 Observation —— SwiftUI 性能提升的新途径

    此外,在 SwiftUI 中,引用类型的数据源(Source of Truth)采用了基于 Combine 框架的 ObservableObject 协议实现。...这导致在 SwiftUI 中,极易产生了大量不必要的视图刷新,从而影响 SwiftUI 应用的性能。 为了改善这些限制,Swift 5.9 版本推出了 Observation 框架。...提供了实现数据双向绑定的能力。...Observation 框架会影响 SwiftUI 编程习惯吗 对我来说,是的。 比如,当前开发者通常会使用结构体( Struct )来构建应用的状态模型。...另外, 我们之前在视图中很多的优化技巧也将发生改变。例如,在使用 ObservableObject 时,我们会通过只引入与当前视图有用的数据,来减少不必要的刷新。

    61820

    为什么我把 Run 出来的 Apk 发给老板,却装不上!

    Run 的 Apk 2.1 textOnly 属性 我们知道,AS Run 起来的 Apk,会使用 Debug 签名进行签名,不过安装不上,并不是签名的问题。...这就是为什么你无法安装 Run 出来的 Debug.apk。 2.2 为什么要这么设计? 这个问题,对于大多数开发者来说,基本上不是问题。...如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。 希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!...毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者! 腾讯T3大牛带你了解 2019 Android开发趋势及必备技术点!...八年Android开发,从码农到架构师分享我的技术成长之路,共勉! 最后祝大家生活愉快~

    2.7K30

    为什么我把 Run 出来的 Apk 发给老板,却装不上!

    Run 的 Apk 2.1 testOnly 属性 我们知道,AS Run 起来的 Apk,会使用 Debug 签名进行签名,不过安装不上,并不是签名的问题。...而是因为,Run 出来的 APK,会在 AndroidManifest.xml 文件中,增加 android:testOnly 属性,正是因为这个属性,阻止了我们使用正常方式安装 APK。...,如果曾经将 Run 出来的 Debug.apk 分享给别人时,早年间是可以正常安装的,那 testOnly 属性是在什么时候被加在 Debug.apk 上的呢?...只有 AS 3.0+ 的 IDE 上,Run 出来的 APK,才会默认带上 testOnly 属性,这将阻止你使用正常的方式安装。...这就是为什么你无法安装 Run 出来的 Debug.apk。 2.2 为什么要这么设计? 这个问题,对于大多数开发者来说,基本上不是问题。

    2.7K00

    SwiftUI-数据流

    SwiftUI中的界面是严格数据驱动的:运行时界面的修改,只能通过修改数据来间接完成,而不是直接对界面进行修改操作。...@Binding 主要有两个作用: 在不持有数据源的情况下,任意读取。 从 @State 中获取数据应用,并保持同步。...UI刷新,所以很适合值类型,因为对值类型里面属性的更新,也会触发整个值类型的重新设置。...不过值类型在传递时会发生复制操作,所以给传递后的值类型即使属性更新了也不会触发最初的传过来的值类型的重新赋值,所以界面并不会刷新,此时需要用@Binding,因为它可以将值类型转为引用类型,这样在传递时...数据流图 从上图可以看出SwiftUI 的数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态的改变 数据状态的变化会触发视图重绘 SwiftUI 内部按需更新视图,

    10.2K20

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

    提示:在SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储在一个视图中的简单属性而设计的。...@Published + @ObservedObject 介绍 @Published是SwiftUI最有用的包装之一,允许我们创建出能够被自动观察的对象属性,SwiftUI会自动监视这个属性,一旦发生了改变...,会自动修改与该属性绑定的界面。...因为SwiftUI更新数据的前提是触发 第一层 绑定的对象 wrapperModel下的属性(字段)发生更新才会调用视图层更新数据 但是 第一次下绑定的对象还绑定了 @ObservedObject 或者其他类型的对象呢.../// 可以直接 调用包装类 notifyUpdate() 方法更新当前对象属性,来达到更新View 的效果 /// 顾忌:如果多次调用 notifyUpdate() View会刷新两边吗 /// 答案是否定的

    3.4K10

    996的程序员们,为什么我不建议你买保险?

    为此,我邀请了我的好朋友资深保险规划师杨震,请他从客观中立的角度给大家开一次讲座,全面解读保险里的陷阱,避免大家日后被坑。讲座开始前,先上一波干货,给大家分析一下日常买保险常见的各种不正确姿势。...而那些花高价买的万能险、返还险等,认为包括了“教育金”和“养老金”,不但有保障,还可以理财,很划算。但其实,这种保险的价格比纯保障型的贵好几倍,同样的价格,保额也严重不足。...但很多人不知道,国家早已对各大保险公司疾病进行了统一,前25种重疾病种各家保险公司定义都是相同的。 所以,我们看重的数量应该是,重疾条款中附加的轻症和中症的项目。...要不然,我们花再多钱也是白搭,更得不到风险防御的效果。 买保险的4个正确打开方式 买保险的各种不正确姿势,每天都在我们身边上演,这么深的水,怎么才能避免被坑钱呢?...其实多花很多冤枉钱 有的朋友在代理人的说服下很容易就买了一份“返还险”,认为到期了不生病还可以返还保费,像是捡了一个大便宜。 但其实,这类保险是两全型保险,在寿险的基础上附加一款重疾险。

    2.8K20

    为什么 Redis 不立刻删除已经过期的数据?

    Redis 的定期删除要比我这里讲的复杂很多,毕竟 Redis 是一个追求高性能的中间件,所以肯定要有复杂的机制控制住定期删除的开销。为什么不立刻删除?答案就是做不到,或者即便能做到,代价也太高。...为什么要随机抽样,同一个 DB 内按照顺序遍历下去不就可以吗 ?确保每个 key 都能遍历到。随机只是为了保证每个 key 都有一定概率被抽查到。...RDB 简单来说就是快照文件,也就是当 Redis 执行 SAVE 或者 BGSAVE 命令的时候,就会把内存里的所有数据都写入 RDB 文件里。...后续主库可以载入这个文件来恢复数据,从库也可以利用这个文件来完成数据同步。对于 RDB 来说,一句话总结就是主库不读不写,从库原封不动。也就是说,在生成 RDB 的时候,主库会忽略已经过期的 key。...AOF 是之前我们就提到过的 Append Only File。Redis 用这个文件来逐条记录执行的修改数据的命令。

    2.5K31

    我是不会运行你的代码吗?不,我是不会导入自己的数据!

    常常遇到有人问起看到分享的教程导入数据的方式是data(dune)等直接调用系统的数据,而自己怎么读入自己的数据呢? 对于初学者来讲,这确实是个问题。...如何准备数据、拿到正确格式的数据并导入后续的代码进行分析,是学习和应用过程中的第一个拦路虎。 为什么教程会习惯使用内置数据?...简单省事、便携可重复;这是内置数据的优势之一; 内置数据模式清晰,通常可以获得较好的结果;这是内置数据的优势之二; 别人用这个,我也用这个,这是一个偷懒的做法。 每个人常识不同。...我不太赞成教程里面用使用内置数据,原因是: 对不会读入数据的人不友好; 不利于探索这篇教程用于实际数据时可能会遇到的问题。示例数据无脑运行,自己的数据无显著差异。...这里涉及到另外一个经常会被问起的问题: 我这一步操作需要提供原始数据,还是标准化之后的数据? 绝大多数情况下,我们需要提供的都是标准化之后的在不同样品之间可比的数据。

    1.4K10

    这个适用于任何数据源的“增量”刷新方法,治愈了我的数据刷新焦虑!|PBI实战

    大部分朋友(我也是其中一员),日常工作中没有Pro账号,或不能将公司数据发布到云端,或只能使用Power BI Report Server进行本地化部署,而且往往有各种数据源,尤其是大量Excel文件,...“不”包含在报表刷新中?...比如我们有很多年的数据,那么我们可以将今年以前的数据全部放在“历史数据”中,今年的数据则放在“新数据”中,这样,报表刷新时,历史数据不刷新,只要刷新今年的数据即可。...将新数据和历史数据做“追加查询”,然后历史数据不加载、不刷新不就可以了? 然而,这是不行的!因为,一旦新数据引用(追加查询)了历史数据,在新数据刷新时,历史数据仍然会被连带刷新!...其实也很简单,先将历史数据设置为启用加载但“不”包含在报表刷新中: 新数据保留默认的既启用加载也包含在报表刷新中: 然后,将两个查询结果均加载到数据模型,然后,在Power BI中新建表,通过DAX公式

    2.5K10

    为什么我抓不到baidu的数据包

    最近,有位读者问起一个奇怪的事情,他说他想抓一个baidu.com的数据包,体验下看包的乐趣。 但却发现“抓不到”,这就有些奇怪了。 我来还原下他的操作步骤。...在wireshark中搜索baidu的包,发现一无所获 这是为啥? 到这里,有经验的小伙伴,其实已经知道问题出在哪里了。 为什么没能抓到包 这其实是因为他访问的是HTTPS协议的baidu.com。...解密后的数据包内容 此时再用http.host == "baidu.com",就能过滤出数据了。 解密后的数据包中可以过滤出baidu的数据包 到这里,其实看不了数据包的问题就解决了。...四次握手中,客户端和服务端最后都拥有三个随机数,他们很关键,我特地加粗了表示。 第一次握手,产生的客户端随机数,叫client random。...如果连接早已经建立了,数据都来回传好半天了,这时候你再去抓包,是没办法解密的。 总结 • 文章开头通过抓包baidu的数据包,展示了用wireshark抓包的简单操作流程。

    1.5K10

    为什么我不推荐另外2种快速传几百G文件的方法!

    引言 我是@程序员小助手 Rman,昨天看到一个题目,说在两台PC之间快速传几百G的文件,有没有什么好的快的办法。 考虑到操作系统平台,有Windows,Linux,MaxOS,这些都有差异。...参看 两台电脑之间如何快速传输几百G的文件?-两台,传输,文件,电脑 ? 这里说说为什么不推荐另外2种。 一个是网络存储。...为什么不推荐,因为pandownload的被举报,开发者收监,百度的名声臭的不可救药。所以不推荐。 国外的网速,你我都是知道的。 还有一个是,软件共享。 有人说这很简单啊,局域网有QQ,不就行了?...回答发出后,有不少网友回复说, “我直接拔下来硬盘,接到新主机上。新主机启动,挂载为新的磁盘,立马可用!” 这个也是经不起推敲的。...因为新系统要想识别一块新的磁盘,且可以直接“读写数据”,这需要操作系统层面的支持。 也就是说,你windows下存储的FAT32格式的文件,NTFS格式的文件,到了新系统上立马得认出来。

    2.8K10

    为什么同样的代码我就是跑不起来,同事却能跑起来?

    不知道小伙伴们有没有遇到过标题的问题,明明同样的一套代码,在自己本地就是运行不起来,或者说在本地只改了一个无关痛痒的代码,看上去人畜无害,结果就报各种乱七八糟的错误,但是同事却能运行的好好的。...这种情况下其实你们的代码版本是不一样的,并不是标题提到的一样的代码,但是很多时候自己内心会以为代码是一样的。...还有就是对方运行的效果可能是缓存数据,可以清除一下对方的缓存,maven 的缓存,浏览器的缓存等所有可能有缓存的地方,然后再次运行,确保在对方的环境下是真正的能正确的运行。 真的没改动代码吗?...还有一种情况就是自己本地的确实改动了部分代码,但是改动的地方看上去是人畜无害的,但是就是跑不起来。...总结 反正跑不起来肯定有原因,不是代码原因就是环境原因,一般经过上面几个方式的排查,都能找到问题了,如果再不行,重新查询拉取代码库也未尝不是一个方法,当然如果实在解决不了,咨询前辈也是一个很有效的方法。

    1.5K30

    避免 SwiftUI 视图的重复计算

    通过 _makeProperty 方法,SwiftUI 得以实现在将视图加载到视图树时,把所需的数据( 值、方法、引用等 )保存在 SwiftUI 的托管数据池中,并在属性图( AttributeGraph...当 SwiftUI 将视图加载到视图树时,通过调用 _makeProperty 完成将数据保存到托管数据池以及在属性图中创建关联的操作,并将数据在托管数据池中的引用保存在 _location ( AnyLocation...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法在视图的构造函数中,更改 State 包装的变量值?...,ObservedObject 并不会在 SwiftUI 托管数据池中保存引用对象的实例( @StateObject 会将实例保存在托管数据池中 ),仅会在属性图中创建视图与视图类型实例中的引用对象的...,我更希望大家将关注点集中于这些技巧在背后对应的原理。

    9.3K81

    iOS开发之WidgetKit补充

    在 iOS 14 正式版发布之前我写了一篇博文《iOS开发之WidgetKit》,iOS 14 正式版发布以后,经测试,Apple 改变了 Widget 的 API,所以本文进行一个补充说明(在前文的基础上做了修改...")) // 然后在后面取出数据 编写Widget 原理:开发者通过 SwiftUI 构建 Views,定义Timelines为 Views 提供对应时间所需的数据,当数据变化时,通过reload更新数据....configurationDisplayName:设置 Widget 在添加界面中显示的标题。 .description::设置 Widget 在添加界面中显示的描述。...getTimeline 的方法里有一个 policy 参数,表示刷新的时机,可以选择.never(不刷新),.atEnd(Entry 显示完毕之后自动刷新) 或 .after(date)(到达某个特定时间后自动刷新...构建界面。

    2K30

    Apple Widget:下一个顶级流量入口?

    这可谓是一次可以载入史册的发布会,宣布了 ARM 架构 Mac 芯片、软硬件的生态大统一、iOS 14 系统界面大改等一系列激动人心的消息。...当然,最让我感兴趣的就是让 iOS 界面大改的 Widget 了。过去几年,iOS 的桌面交互体验可谓是一言难尽,Widget 的加入无疑是一次比较大的破局。...在看发布会的时候,我的脑海里就浮现出一个问题:“这会是下一个互联网公司竞争的流量入口吗?” 先不抛结论,让我们先看一下 WWDC20 介绍了哪些新东西。 什么是 Widget?...当 Timeline Provider 提供完下一阶段的数据之后,就会停止运行。系统也会根据 entry 的信息,到点对 Widget 的展示内容进行刷新。...虽然,从目前来看 Pure SwiftUI 的设计,可以做的事情真的很少,但是我也相信,苹果会不断优化 Pure SwiftUI 的能力。让开发者可以以最低的开发成本,适配更多的平台。

    2K20
    领券