首页 > 解决方案 > SwiftUI:ViewModifier 与其支持的视图不同步

问题描述

我有一个简单的 SwiftUI 视图,它有一个StateObject,我ViewModifier为该视图创建了一个,并在视图修饰符中添加了一个onReceive事件来监听来自主视图 ( MyView) 的更改,如下所示:


class MyViewModel: ObservableObject {
    @Published var myProperty: Bool = false
}

struct MyView: View {
    @StateObject var myViewModel = MyViewModel()
    
    var body: some View {
        Text("Hello, world!")
            .padding()
            .modifier(MyViewModifier(myViewModel: myViewModel))
            .onTapGesture {
                myViewModel.myProperty = true
            }
    }
}

struct MyViewModifier: ViewModifier {
    @ObservedObject var myViewModel: MyViewModel
    
    func body(content: Content) -> some View {
        content
            .onReceive(myViewModel.$myProperty, perform: { newValue in
                print("new value for myProperty is \(newValue)")
            })
    }
}

但是,当我点击文本“Hello world”时,onReceive修饰符没有被触发MyViewModifier,我尝试过的是:

  1. 更改StateObjectObservedObjectin MyView
  2. 更改ObservedObjectStateObjectin MyViewModifier
  3. 将 to更改ObservedObjectBindinginMyViewModifier但找不到将整个绑定StateObjectMyViewto传递的方法MyViewModifier

以上都没有解决问题。

- note:我需要将整个视图模型对象传递给,MyViewModifier因为这是来自大型项目的一个小样本,它需要整个视图模型对象在视图修改器中可用。

标签: iosswiftswiftui

解决方案


利用onChange(of:perform:)

为这个视图添加一个修饰符,当一个特定的值改变时触发一个动作。 https://developer.apple.com

onChange(of: myViewModel.myProperty) { value in
    print("Value \(value)")
}

推荐阅读