如何使用 MVVM 设计模式绑定对象?

How to bind objects using MVVM design pattern?

我正在尝试将下面的代码 (1.) 更改为 MVVM 架构 (2.),但不知道如何绑定对象。

我认为问题是 FirstView 只传递值但实际上不是绑定对象,我尝试了一些不同的方法但总是卡在不知道如何将绑定对象分配给@Published。

有人可以给一些提示吗?

  1. (工作正常)
struct FirstView: View {
    @State var showSecondView = false

    var body: some View {
        Button(action: {
            self.showSecondView.toggle()
        }) {
            Text("Show second view")
        }
        .sheet(isPresented: $showSecondView) {
            SecondView(showSecondView: self.$showSecondView)
        }
    }
}
struct SecondView: View {
    @Binding var showSecondView: Bool

    var body: some View {
        Button(action: {
            self.showSecondView.toggle()
        }) {
            Text("Dismiss")
        }
    }
}
  1. (MVVM)
struct FirstView: View {
    @ObservedObject var vm = FirstViewModel()

    var body: some View {
        Button(action: {
            self.vm.showSecondView.toggle()
        }) {
            Text("Show second view")
        }
        .sheet(isPresented: $vm.showSecondView) {
            SecondView2(vm: SecondViewModel(showSecondView: self.vm.showSecondView))
        }
    }
}

class FirstViewModel: ObservableObject {
    @Published var showSecondView = false
}
struct SecondView: View {
    @ObservedObject var vm: SecondViewModel

    var body: some View {
        Button(action: {
            self.vm.showSecondView.toggle()
        }) {
            Text("Dismiss")
        }
    }
}

class SecondViewModel: ObservableObject {
    @Published var showSecondView: Bool

    //Right here, i'm not sure how to bind 'showSecondView' from FirstView
    init(showSecondView: Bool) {
        self.showSecondView = showSecondView
    }
}

您可以直接将 Binding<Bool> 传递给第二个虚拟机,但这样就不需要 @Published var,也不需要 ObservableObject 和标记为 @ObservedObject。可能有更好的解决方案。

struct FirstView: View {
    @ObservedObject var vm = FirstViewModel()

    var body: some View {
        Button(action: {
            self.vm.showSecondView.toggle()
        }) {
            Text("Show second view")
        }
        .sheet(isPresented: $vm.showSecondView) {
            SecondView(vm: SecondViewModel(showSecondView: self.$vm.showSecondView))
        }
    }
}

class FirstViewModel: ObservableObject {
    @Published var showSecondView = false
}

struct SecondView: View {
    var vm: SecondViewModel

    var body: some View {
        Button(action: {
            self.vm.showSecondView.wrappedValue.toggle()
        }) {
            Text("Dismiss")
        }
    }
}

class SecondViewModel {
    var showSecondView: Binding<Bool>

    init(showSecondView: Binding<Bool>) {
        self.showSecondView = showSecondView
    }
}