iOS 14 SwiftUI UIViewRepresentable updateUIView 没有检测到 ObservedObject 的变化?

Posted

技术标签:

【中文标题】iOS 14 SwiftUI UIViewRepresentable updateUIView 没有检测到 ObservedObject 的变化?【英文标题】:iOS 14 SwiftUI UIViewRepresentable updateUIView doesn't detect ObservedObject changing? 【发布时间】:2020-11-28 05:43:52 【问题描述】:

我有 UIViewRepresentable 实现的 UITextView。

struct CustomTextView: UIViewRepresentable 
    var tmpTextVM: TmpTextViewModel
    
    func makeUIView(context: UIViewRepresentableContext<CustomTextView>) -> UITextView 
        let textView = UITextView()
        textView.backgroundColor = UIColor.clear
        textView.isScrollEnabled = false
        textView.text = "aaaaaaaaaaaaaaaaaa"
        textView.font = UIFont(name: "ArialMT", size: 20)
        return textView
    

    func updateUIView(_ uiView: UITextView, context: Context) 
        uiView.textColor = tmpTextVM.color
        
    

我想这样使用它。

struct ContentView: View 
    
    @ObservedObject var tmpTextVM: TmpTextViewModel
   
        var body: some View 

            VStack 
                
                Button(action: 
                    tmpTextVM.changeColor(UIColor.red)
                )
                    Image(systemName:"eyedropper.full")
                
                
                CustomTextView(tmpTextVM: tmpTextVM)
                    .foregroundColor(Color(tmpTextVM.color))
                    .frame(width:300, height: 300, alignment: .topLeading)
                    .border(Color.red, width: 1)
                    
            
    


ios 13 上,如果我点击按钮,则会调用 updateUIView 并更改该文本颜色,但在 iOS 14 上不会调用 updateUIView。有什么方法可以通过更改 iOS 14 上的 ObservedObject 来调用视图更新?

这里是 TmpTextViewModel 及其模型的代码。

    class TmpTextViewModel: ObservableObject 
    
    @Published private var tmpTextModel: TmpTextModel = TmpTextModel()
    
    var color: UIColor tmpTextModel.color
    
    func changeColor(_ color: UIColor) 
        tmpTextModel.color = color
    
    

struct TmpTextModel 
    
   var color:UIColor = UIColor.purple
    


【问题讨论】:

适用于 Xcode 12.1 / iOS 14.1 【参考方案1】:

你需要让ˋCustomTextViewˋ监听ˋTmpTextViewModelˋ的变化。

只需将ˋCustomTextViewˋ中的ˋtmpTextVMˋ声明为ˋ@ObservedOjectˋ。

struct CustomTextView: UIViewRepresentable 
   @ObservedObject var tmpTextVM: TmpTextViewModel
   //....

【讨论】:

谢谢!这很好用!我不明白为什么它在 iOS13 上运行... 我猜这是由于 SwiftUI 引擎的优化。 好的,我明白了!谢谢你的帮助!!

以上是关于iOS 14 SwiftUI UIViewRepresentable updateUIView 没有检测到 ObservedObject 的变化?的主要内容,如果未能解决你的问题,请参考以下文章

仅在 iOS 14、SwiftUI 时显示一些视图

SwiftUI:仅在 iOS 14+ 上使用“accessibilityIdentifier”

如何更改 SwiftUI 和 iOS 14 中的单元格背景颜色?

列表 iOS 14 SwiftUI 中的额外间距

iOS 14.0 之后如何解决 SwiftUI 中 RealmSwift.App 和 SwiftUI.App 的冲突?

SwiftUI 列表的透明背景——iOS14 中的行为变化