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

iOS 14 SwiftUI UIViewRepresentable updateUIView检测不到ObservedObject更改?

在iOS 14中,SwiftUI引入了UIViewRepresentable协议,该协议允许我们在SwiftUI中使用UIKit的视图。在使用UIViewRepresentable时,我们可能会遇到一个问题,即updateUIView方法无法检测到ObservedObject的更改。

ObservedObject是SwiftUI中的一种属性包装器,用于观察对象的变化并更新视图。然而,在UIViewRepresentable中,updateUIView方法只会在UIView的外观(appearance)发生更改时被调用,而不会在ObservedObject的更改时被调用。

为了解决这个问题,我们可以使用Coordinator来实现ObservedObject的更改检测。Coordinator是UIViewRepresentable的一个内部类,用于处理与UIKit视图之间的交互。我们可以在Coordinator中使用ObservedObject来监视其更改,并在需要时手动更新UIView。

下面是一个示例代码,演示了如何在UIViewRepresentable中检测ObservedObject的更改:

代码语言:txt
复制
import SwiftUI

struct MyView: UIViewRepresentable {
    @ObservedObject var myObject: MyObject
    
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        // 设置视图的初始状态
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        // 在这里更新UIView的外观
        
        // 检测ObservedObject的更改
        if myObject.someProperty {
            // 执行相应的操作
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject {
        var parent: MyView
        
        init(_ parent: MyView) {
            self.parent = parent
            super.init()
            
            // 监听ObservedObject的更改
            self.parent.myObject.objectWillChange
                .sink { _ in
                    // 更新UIView
                    self.parent.updateUIView(self.parent.uiView, context: self.parent.context)
                }
                .store(in: &cancellables)
        }
        
        var cancellables = Set<AnyCancellable>()
    }
}

class MyObject: ObservableObject {
    @Published var someProperty: Bool = false
    // 其他属性和方法...
}

在上面的示例代码中,我们创建了一个名为MyView的UIViewRepresentable,并使用@ObservedObject属性包装器来观察MyObject的变化。在makeCoordinator方法中,我们创建了一个Coordinator,并在其中订阅了ObservedObject的objectWillChange发布者。当ObservedObject发生更改时,我们手动调用updateUIView方法来更新UIView的外观。

这样,我们就可以在UIViewRepresentable中检测到ObservedObject的更改,并相应地更新UIView。请注意,这只是一种解决方案,具体的实现可能因项目需求而异。

推荐的腾讯云相关产品:腾讯云移动开发平台(https://cloud.tencent.com/product/mpp)

希望以上信息能对您有所帮助!

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

相关·内容

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

接着看下写作环境: Swift 5, iOS 14, Xcode 12 下面就是正文了。 你已经在 iOS 应用程序上工作了一段时间,你认为你很聪明。 你以为你已经做到了,嗯?...AVPlayer 是在 iOS 上播放视频的核心。 播放器对象可以启动和停止您的视频,更改其播放速率,甚至可以调高和调低音量。 将播放器视为能够一次管理一个媒体资产的播放的控制器对象。...AVPlayerLayer } 为了能够在 SwiftUI 中使用此视图,您需要使用 UIViewRepresentable 创建一个包装器。...: [URL] } UIViewRepresentable 是一个协议。...缺点是,在撰写本文时,iOS 14.5是可用的最新版本,VideoPlayer 的 SwiftUI 视图未显示画中画按钮。

6.9K10

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

1.SwiftUI 是Apple 新出面向未来、跨多端解决方案、声明式编程 SwiftUI最新版本 2.0 但是需要 IOS 14 支持,多数现在还用的是IOS 13 所以很多不完善的东西都用SwiftUIX...@State 介绍 因为SwiftUI View 采用的是结构体,当创建想要更改属性的结构体方法时,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...@State允许我们绕过结构体的限制:我们知道不能更改它们的属性,因为结构是固定的,但是@State允许SwiftUI将该值单独存储在可以修改的地方。...@Published + @ObservedObject 介绍 @Published是SwiftUI最有用的包装之一,允许我们创建出能够被自动观察的对象属性,SwiftUI会自动监视这个属性,一旦发生了改变...还会触发第一次对象属性更新吗,答案是不能的 你可以在 didSet 事件里面捕捉,是捕捉不到的,所以视图是不会更新的,那这还有其他解决方案吗 有: 调用对象 wrapperModel.objectWillChange.send

3K10

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

TextField("", text: $text) .introspect(.textField, on: .iOS(.v17)) { // 持有 UITextField 实例...@ObservedObjectSwiftUI 中用于为视图与 ObservableObject 实例之间创建关联的属性包装器,主要用于在视图存续期内引入外部的 ObservableObject...注意事项 在 iOS 13 中,由于没有提供 @StateObject ,此时 @ObservedObject 是唯一选择,可能会因为无法保证实例的存续期而产生 意想不到的结果[12],为了避免类似问题...在 iOS 17+ 的环境中,如果应用主要依赖于 Observation 和 SwiftData 框架,那么这三个属性包装器的使用频率可能会相对较低。.../posts/StateObject_and_ObservedObject/ [12] 意想不到的结果: https://fatbobman.com/posts/stateobject/ [13]

20210

TCA - SwiftUI 的救星?(一)

SwiftUI 很赞,但是… iOS 15 一声炮响,给开发们送来了全新版本的 SwiftUI。它不仅有更加合理的异步方法和全新特性,更是修正了诸多顽疾。...可以说,从 iOS 14 开始,SwiftUI 才算逐渐进入了可用的状态。而最近随着公司的项目彻底抛弃 iOS 13,我也终于可以更多地正式在工作中用上 SwiftUI 了。...虽然 SwiftUI 中提供了诸多状态管理的关键字或属性包装 (property wrapper),比如 @State、@ObservedObject 等,但是你很难说官方 SwiftUI 教程里关于数据传递...我们类比一下这些步骤在 SwiftUI 中的实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject 的 @Published 发生变化时,SwiftUI...在 SwiftUI 中,body 的刷新是 SwiftUI 运行时通过 @ObservedObject 属性包装所提供的特性。现在这部分内容被包含在了 WithViewStore 中。

3.2K30

SwiftUI-数据流

,要想建立依赖关系就要用 ObservableObject,与之配合的是@ObservedObject和@Published。...添加发布者,实现一个属性,名字不能乱写,否则没有效果 let objectWillChange = ObservableObjectPublisher() // 2.只要name发生更改...,属性观察器就会调用,告诉objectWillChange发布者发布有关我们的数据已更改的消息,以便所有订阅的视图都可以刷新的消息 var name = "" { willSet...使用@EnvironmentObject,SwiftUI 将立即在环境中搜索正确类型的对象。如果找不到这样的对象,则应用程序将立即崩溃。...@ObservedObject、 @EnvironmentObject 一般修饰的都是 View 外部的数据: 系统级的消息 网络或本地存储的数据 界面之间互相传递的数据

10.1K20

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

是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...contextMenu_2022-10-26_14.01.21.2022-10-26 14_02_29如何对 @State 变量进行测试Q:对于测试 SwiftUI 视图中的 @State 变量是否有推荐的方式...最近,我注意到 SwiftUI 视图的 onAppear 在意想不到的时间启动,比如当 UITabBarController 被创建时,而不是当视图本身出现时。...详情请阅读 在 SwiftUI 中实现视图居中的若干种方法[14] 。NavigationSplitView 的尺寸规则Q:你好!.../posts/new_navigator_of_SwiftUI_4/[14] 在 SwiftUI 中实现视图居中的若干种方法: https://www.fatbobman.com/posts/centering_the_View_in_SwiftUI

12.2K20

SwiftUI 状态管理系统指南

为了解决上述问题,苹果在iOS 14和macOS Big Sur中引入了一个新的属性包装器,名为StateObject。...标记为StateObject的属性与ObservedObject的行为完全相同——此外,SwiftUI将确保存储在此类属性中的任何对象不会因为框架在重新渲染视图时重新创建新实例而被意外释放: struct...把StateObject和ObservedObject看作是State和Binding的参考类型,或者SwiftUI版本的强和弱属性。...有两种主要的方法来使用SwiftUI的环境。...我希望这篇指南能成为一个很好的方式来概述SwiftUI的各种状态处理机制,尽管一些更具体的API被遗漏了,这篇文章中强调的概念应该涵盖了所有基于SwiftUI的状态处理的绝大多数用例。

5K20

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

与 UIKit 使用的命令式导航方式不同,SwiftUI 作为一个声明式框架,感知与设置两者之间是二位一体的关系。读取状态即可获知当前的导航位置,更改状态便可调整导航路径。...因此在 SwiftUI 中,掌握两种导航容器的状态表述差异是实现自适应导航方案的关键。...最易用的方案 —— NavigationSplitView + ListnavigationSplitView-three_38_14struct ThreeColumnsView: View {...: info.rootID)) .foregroundColor(.blue) } }}struct SideBarView: View { @ObservedObject...一次编写便可对应多种设备,这本就是 SwiftUI 的一个重要特点。尽管仍存在一些不足,但新的导航机制已经在这一方面取得了长足的进步。唯一遗憾的是,仅支持 iOS 16+。希望本文能够对你有所帮助。

4.2K30

肘子的 Swift 周报 #017 | 新博客的数据盘点

一个月后,即从 12 月 25 日至 1 月 23 日,博客的访问数据呈现出显著的变化: 根据谷歌分析: UV(独立访客)达到 14K,相比之前的 30 天增长了 156%。...第一部分为 探讨 SwiftUI 中的关键属性包装器:@State、@Binding、@StateObject、@ObservedObject、@EnvironmentObject 和 @Environment...Unit Test the Observation Framework[7] Jacob Bartlett[8] 这篇文章探讨了在 iOS 17 中如何有效地对 Observation 框架进行单元测试...Insight on the changes to Apple policy in the EU from the Revenue Cat webinar[13] Gabrielle Earnshaw[14...StateObject、@ObservedObject、@EnvironmentObject 和 @Environment: https://fatbobman.com/zh/posts/exploring-key-property-wrappers-in-swiftui

10210

SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

您已经了解了如何使用@State处理单个视图的局部状态,以及@ObservedObject如何使我们在视图之间传递一个对象,以便我们可以共享它。...如果我们使用@ObservedObject,则需要将我们的对象从每个视图传递到下一个视图,直到它最终到达可以使用该视图的视图E,这很烦人,因为B,C和D不在乎它。...在向您展示一些代码之前,还有最后一件事:环境对象使用您已经学过的ObservableObject协议,SwiftUI将自动确保共享同一环境对象的所有视图在更改时都会更新。...接下来,我们可以定义两个SwiftUI视图以使用我们的新类。...如果在环境中找不到用户,您的代码就会 ,因此请小心。

9.5K20

ObservableObject研究

章节中,我们通过了一段代码进行过@State和@ObservedObject对于依赖注入时机的推测。...View树分支同EnviromentObject类似,注入EnviromentKey的依赖也是显性的 @Environment(\.myKey) var currentPage 我们可以通过以下方式,更改该...•在当前View使用SwiftUI提供的其他包装属性我现在最常使用的SwiftUI的其他包装属性就属@FetchRequest了。...由于任何状态的变化ObservedObject只有通过ObjectWillChangePublisher这一个途径来通知与其依赖的View,因此我们如果要解决这个问题,只能放弃使用ObservedObject...上述代码我已经放到了Github 总结 之所以进行这方面的探讨是由于我的app出现了响应的粘滞(和我心目中iOS平台上该有的丝滑感有落差)。在研究学习的过程中也让我对SwiftUI的有了进一步的认识。

2.4K60

架构之路 (五) —— VIPER架构模式(一)

开始 首先看下主要内容: 在本教程中,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...下面看下写作环境 Swift 5, iOS 13, Xcode 11 接着就是正文了。 VIPER架构模式是MVC或MVVM的另一种选择。...在此过程中,您还将了解您的iOS项目中的SwiftUI和Combine。 打开启动项目。这包括一些代码,让你开始: 当你构建其他视图时,ContentView会启动它们。...MVC (Model-View-Controller)是2010年iOS应用程序架构中最常使用的模式。...将其内容设置为: import SwiftUI struct TripMapView: View { @ObservedObject var presenter: TripMapViewPresenter

17.4K10
领券