简体   繁体   English

SwiftUI MVVM 已发布 var 未在不同视图之间更新

[英]SwiftUI MVVM published var is not updating between different views

I have the View 1 and View 2, View 1 has a button that navigate to View 2, in View 2 there is list of options to choose when clicked is expected to update a variable in View 1, but the variable in View 1 does not get updated.我有视图 1 和视图 2,视图 1 有一个导航到视图 2 的按钮,在视图 2 中有可供选择的选项列表,当单击时可以选择更新视图 1 中的变量,但视图 1 中的变量没有得到更新。

View1.swift查看1.swift

struct View1: View {
    @ObservedObject var viewModel = MyViewModel()
    
    var body: some View {
        NavigationLink(destination: View2()) {
            VStack {
                Text(self.viewModel.addressChosen)
            }
        }
    }
}

View2.swift查看2.swift

struct View2: View {
    @ObservedObject var viewModel = MyViewModel()

    var body: some View {
        Button(action: {
            self.viewModel.chooseAddress(addressSelected: "Chosen Address")
        }) {
            VStack {
                Text(self.viewModel.addressChosen)
            }
        }
    }
}

MyViewModel.swift MyViewModel.swift

class MyViewModel: ObservableObject, ModelService {
    @Published var addressChosen = "Default"

    func chooseAddress(addressSelected: String) {
        print(addressSelected)
        self.addressChosen = addressSelected
    }
}

The var addressChosen is updated in View 2, but when I go back to View 1, the variable does not get updated. var addressChosen 在视图 2 中更新,但是当我 go 回到视图 1 时,变量没有得到更新。 What am I doing wrong?我究竟做错了什么? Thank you.谢谢你。

You are using two different MyViewModel .您正在使用两个不同的 MyViewModel You need to pass the same MyViewModel() or only addressChosen from View1 to View2 .您需要将相同的MyViewModel()或仅addressChosenView1传递到View2

Pass the same MyViewModel() to View2将相同的MyViewModel()传递给 View2

struct View1: View {
    @ObservedObject var viewModel = CartViewModel()
    
    var body: some View {
        NavigationLink(destination: View2(viewModel: viewModel)) {
            VStack {
                Text(self.viewModel.addressChosen)
            }
        }
    }
}

struct View2: View {
    @ObservedObject var viewModel: CartViewModel

    var body: some View {
        Button(action: {
            self.viewModel.chooseAddress(addressSelected: "Chosen Address")
        }) {
            VStack {
                Text(self.viewModel.addressChosen)
            }
        }
    }
}

class CartViewModel: ObservableObject {
    @Published var addressChosen = "Default"

    func chooseAddress(addressSelected: String) {
        print(addressSelected)
        self.addressChosen = addressSelected
    }
}

Pass addressChosen to View2 addressChosen传递给View2

struct View1: View {
    @ObservedObject var viewModel = CartViewModel()
    
    var body: some View {
        NavigationLink(destination: View2(addressChosen: $viewModel.addressChosen)) {
            VStack {
                Text(self.viewModel.addressChosen)
            }
        }
    }
}

struct View2: View {
    @Binding var addressChosen: String

    var body: some View {
        Button(action: {
            self.addressChosen =  "Chosen Address"
        }) {
            VStack {
                Text(self.addressChosen)
            }
        }
    }
}

class CartViewModel: ObservableObject {
    @Published var addressChosen = "Default"

    func chooseAddress(addressSelected: String) {
        print(addressSelected)
        self.addressChosen = addressSelected
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM