如何使用 ObservableObject 更新 UIViewRepresentable

2024-03-12

我正在尝试学习与 SwiftUI 结合,并且正在努力如何更新我的视图(来自 UIKit)ObservableObject(之前BindableObject)。问题是,显然,方法updateUIView一旦@Published对象发送它已更改的通知。

class DataSource: ObservableObject {
    @Published var locationCoordinates = [CLLocationCoordinate2D]()
    var value: Int = 0

    init() {
        Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { timer in
            self.value += 1
            self.locationCoordinates.append(CLLocationCoordinate2D(latitude: 52, longitude: 16+0.1*Double(self.value)))
        }
    }
}

struct MyView: UIViewRepresentable {
    @ObservedObject var dataSource = DataSource()

    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {
        let newestCoordinate = dataSource.locationCoordinates.last ?? CLLocationCoordinate2D(latitude: 52, longitude: 16)
        let annotation = MKPointAnnotation()
        annotation.coordinate = newestCoordinate
        annotation.title = "Test #\(dataSource.value)"
        view.addAnnotation(annotation)
    }
}

如何绑定那个locationCoordinates以这样的方式将数组添加到视图中,实际上每次刷新时都会添加一个新点?


为了确保您的ObservedObject不会被多次创建(您只需要它的一份副本),您可以将其放在您的外部UIViewRepresentable:

import SwiftUI
import MapKit

struct ContentView: View {
    @ObservedObject var dataSource = DataSource()

    var body: some View {
        MyView(locationCoordinates: dataSource.locationCoordinates, value: dataSource.value)
    }
}
class DataSource: ObservableObject {
    @Published var locationCoordinates = [CLLocationCoordinate2D]()
    var value: Int = 0

    init() {
        Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { timer in
            self.value += 1
            self.locationCoordinates.append(CLLocationCoordinate2D(latitude: 52, longitude: 16+0.1*Double(self.value)))
        }
    }
}

struct MyView: UIViewRepresentable {
    var locationCoordinates: [CLLocationCoordinate2D]
    var value: Int

    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {
        print("I am being called!")
        let newestCoordinate = locationCoordinates.last ?? CLLocationCoordinate2D(latitude: 52, longitude: 16)
        let annotation = MKPointAnnotation()
        annotation.coordinate = newestCoordinate
        annotation.title = "Test #\(value)"
        view.addAnnotation(annotation)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ObservableObject 更新 UIViewRepresentable 的相关文章

随机推荐

  • Hibernate使用PostgreSQL序列不影响序列表

    我已将 Hibernate 配置为使用 PostgreSQL 序列 通过注释 来生成主键值id栏目如下 Id SequenceGenerator name pk sequence sequenceName entity id seq Gen
  • Tapestry 5.4:如何使用外部 dist 包?

    我想使用 swagger ui 中的 dist 包来公开我的 web 服务 dist pkg 位于此处 https github com swagger api swagger ui tree master dist https githu
  • 核心数据不保存对 Transformable 属性的更改

    我正在保存一个NSMutableArray在我的核心数据存储中的 Transformable 属性中 我可以使用中的数据正确创建实体NSMutableArray然后将其从属性中加载出来 甚至进行更改 当我浏览我的应用程序并重新访问它时 我的
  • 如何在jsp中显示从dao获取的数据

    in jsp table width 100 border 0 cellspacing 2 cellpadding 2 tr class tab highlighted 2 td class tab highlighted 2 width
  • 如何创建php调度进程?

    我被要求创建一个网络应用程序 它将在特定时间内向用户发送更新 例如 2009 年 6 月至 8 月期间 user1 每 5 分钟请求一次更新 user2 仅今天每 10 分钟请求一次更新 从 2009 年 6 月到 8 月 user3 每
  • 当我使用 Tomcat 7 JDBC 连接池取消部署 Web 应用程序时,为什么连接仍然存在?

    我已经将一个最小的 Spring Web 应用程序部署到 Tomcat 7 0 22 它由几个页面 一个控制器 一个服务和一个 DAO 组成 该 DAO 有一个运行 SELECT 查询的方法 Web 应用程序配置为使用新的Tomcat JD
  • 访问带有向量索引的矩阵

    我有一个矩阵 a 16x3 和一个向量 b 16x1 b 显示矩阵 a 中每行有多少个有效值 a magic 3 a 8 1 6 3 5 7 4 9 2 b 1 3 2 b 1 3 2 我想做的是将无效值设置为 NaN a b 1 end
  • 活动滚动时绘制面板边框

    当我尝试制作面板边框时 我遇到了问题 首先我将属性面板设置为 自动滚动 真 然后我将边框绘制代码放在面板事件中 ControlPaint DrawBorder e Graphics ClientRectangle Color Black 5
  • 需要 FLAG_ACTIVITY_NEW_TASK 澄清

    所以我的问题是 我启动 App1 打开 Screen1 然后打开 Screen2 我按 Home 键 将 App1 留在后台 我打开 App2 并启动 App1 Screen1FLAG ACTIVITY NEW TASK https dev
  • 通过 VBA 设置默认打印机

    我正在运行一个在两台打印机之间切换的 Excel 宏 一台名为 RecOffice Pink 另一台名为 RecOffice White 这是解决 VBA 无法轻松指定打印托盘问题的一个巧妙的解决方法 粉红色打印机除了一个纸盘之外的所有纸盘
  • 抓取 Finviz 页面以获取表中的特定值

    首先我要说的是 我不支持抓取服务条款不允许的网站 这纯粹是为了从各个网站假设收集财务数据的学术研究 如果有人想看这个链接 存储在 URLs csv 文件中 想要抓取第 2 5 列 即 Ticker Perf Week Perf Month
  • 使用 csv 文件从元组到整数

    我在使用 csv reader 时遇到了一些问题 我有两个文件 FileA 对应 9 个地理坐标 x 第 1 列 和 y 第 2 列 没有标题 该文件从 Excel 保存到 csv 文件中 301506 5918202 301012 591
  • 防止注销后的返回操作

    注销后 如果我按浏览器中的后退按钮 它不应该显示上一页 它必须转到默认页面 仅限登录页面 所以我尝试了很多方法 Ruby on Rails应用程序 例如 history forward onbeforeunload 元标记中的过期缓存 ht
  • 使用 sed 交换两个单词

    我试图交换一行中的两个单词 但它不起作用 例如 今天是我大学的第一天 应该是 我的今天是大学的第一天 这是我尝试过的 sed s a zA z0 9 a zA z0 9 a zA z0 9 3 2 1 filename txt 我究竟做错了
  • 阻止导入的模块出现在代码完成中?

    如何防止导入的模块被访问 即堵塞我的代码完成选项 例如 testmodule py import os def o stuff return 当我导入时testmodule 我不想os每次我打字时都会出现testmodule 我只想要在 t
  • 基于寄存器的虚拟机如何工作?

    基于寄存器的虚拟机如何工作 我正在寻找有关基于寄存器的虚拟机如何工作的介绍 有人可以帮忙吗 谢谢 具有可用源代码的基于寄存器的 VM 的一个示例是Lua http www lua org 有许多资源可能会有所帮助 Lua 5 0的实现 ht
  • WPF Ribbon - 隐藏选项卡标题(单选项卡应用程序)

    我是 WPF 新手 正在尝试使用功能区控件 我的应用程序中有一个选项卡 并且希望隐藏标题但仍显示选项卡本身 我一直在尝试各种属性和样式 但我只能隐藏整个选项卡 我尝试过 ribbontab 可见性 ribbontab header 可见性
  • 无论如何,Task.Factory.StartNew 在 UI 线程上调用

    我必须处理一个奇怪的问题 至少从我的角度来看是这样 我使用任务来等待变量获取特定值 然后再次在 ui 线程上运行 继续 部分 现在的问题是 在我调用 StartNew 之前 调用内部的 ManagedThreadId 是相同的 它会冻结我的
  • 检查表达式语言中是否存在参数[重复]

    这个问题在这里已经有答案了
  • 如何使用 ObservableObject 更新 UIViewRepresentable

    我正在尝试学习与 SwiftUI 结合 并且正在努力如何更新我的视图 来自 UIKit ObservableObject 之前BindableObject 问题是 显然 方法updateUIView一旦 Published对象发送它已更改的