首页
学习
活动
专区
工具
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)

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

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

相关·内容

没有搜到相关的沙龙

领券