当前位置: 首页 > news >正文

[SwiftUI 开发] 嵌套的ObservedObject中的更改不会更新UI

 
1. 发生问题的demo

 

业务逻辑代码 

class Address: ObservableObject {@Published var street = "123 Apple Street"@Published var city = "Cupertino"
}class User: ObservableObject {@Published var name = "Tim Cook"@Published var address = Address()
}struct ContentView: View {@ObservedObject var user = User()var body: some View {VStack {Text("Name: \(user.name)")Text("Address: \(user.address.street), \(user.address.city)")Button("Change Address") {user.address.street = "New York"}}}
}

当我有一个嵌套的ObservedObject时,嵌套对象的已发布属性的更改不会更新UI,直到父对象发生变化,才会刷新。

 
2.  修改后的代码


SwiftUI(更准确地说是Combine)只能看到值的变化,因此,它可以看到@Published结构实例的属性值的变化,而不能看到@Published类
如果您希望基于这些嵌套对象的属性值的更改来更新Ul,则使用嵌套对象的结构实例。如果必须使用类实例,请使用另一种机制显式地通知更改。下面是使用struct代替class的NestedObject修改的代码

 业务逻辑代码 

struct Address {var street = "123 Apple Street"var city = "Cupertino"
}class User: ObservableObject {@Published var name = "Tim Cook"@Published var address = Address()
}struct ContentView: View {@ObservedObject var user = User()var body: some View {VStack {Text("Name: \(user.name)")Text("Address: \(user.address.street), \(user.address.city)")Button("Change Address") {user.address.street = "New York"}}}
}

总结一句话,一个对象只需要当前属性@Published就可以了,子类使用struct

http://www.lryc.cn/news/389360.html

相关文章:

  • 全面了解机器学习
  • 作为图形渲染API,OpenGL和Direct3D的全方位对比。
  • 安装Rabbitmq遇到的坑
  • React+TS 从零开始教程(4):useEffect
  • 网络安全学习路线图(2024版详解)
  • 你了解人工智能吗?
  • 如何使用Vue.js实现动态文档生成与下载功能
  • web基础及http协议
  • 【vuejs】vue-router 之 addRoute 动态路由的应用总结
  • LeetCode 30. 串联所有单词的子串
  • python本学期所有代码!
  • 武汉星起航:无锡跨境电商加速“出海”,物流升级助品牌全球布局
  • Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab接口自动化测试框架详解
  • stm32-hal库(5)--usart串口通信三种模式(主从通信)(关于通信失败和串口不断发送数据问题的解决)
  • 一文学会LVS:概念、架构、原理、搭建过程、常用命令及实战案例
  • [Go 微服务] Kratos 使用的简单总结
  • 【unity实战】使用旧输入系统Input Manager 写一个 2D 平台游戏玩家控制器——包括移动、跳跃、滑墙、蹬墙跳
  • 【实战】EasyExcel实现百万级数据导入导出
  • Graalvm配置文件与Feature和Substitute机制介绍
  • Appium adb 获取appActivity
  • 调整分区失败致盘无法访问:深度解析与数据恢复全攻略
  • 试用笔记之-汇通计算机等级考试软件一级Windows
  • Java的NIO体系
  • 自下而上的选股与自上而下的选股
  • Tech Talk:智能电视eMMC存储的五问五答
  • scikit-learn教程
  • CentOS 7 搭建rsyslog日志服务器
  • 使用Spring Boot Actuator监控应用健康状态
  • leetcode刷题:vector刷题
  • CGI面试题及参考答案