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

3

我正在尝试将下面的代码(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
    }
}
1个回答

4
你可以直接将Binding<Bool>传递给第二个VM,但这样做就不需要有@Published变量,并且它也不需要被标记为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
    }
}

非常感谢,真的很有帮助。 - raxabizze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接