@Published value don't pass through views

126 Views Asked by At

I'm beggining with SwiftUI and I wanted to develop a small simple app to practice. I have a problem with @Published property that don't pass through views and so don't update the view.

I explain : In the first view I calculate the vMoyenne property and update it. I wanted to show this value in the next view ("Passage") to be able to use it for some other calculation but I tried many thing and the value in the "Passage" View doesn't update...

Here is the code :

ContentView.swift :

struct ContentView: View {
    var body: some View {
        TabView {
            SpeedView().tabItem {
                Label("Vitesse", systemImage: "figure.run.circle.fill")
            }
            
            PassageView(parameters: Parameters()).tabItem {
                Label("Passage", systemImage: "timer.circle.fill")
            }
        }
        
    }
}

Parameters.swift

class Parameters: ObservableObject {
    @Published var distance: Double?
    
    static let units = ["m", "km"]
    @Published var unit = 1
    @Published var hour: Int = 0
    @Published var minute: Int = 0
    @Published var second: Int = 0
    @Published var vMoyenne = 0.0
    @Published var allure = 0.0
    @Published var convertedDecimalToSeconds = 0
    
    var time: Int?
  
    
    ...
    
    func calcVMoy() -> Void{
        var d = distance!
        let t = Double(time!) / 3600
        var unite: String {
            return Parameters.units[unit]
        }
        var calc = 0.0
        if unite == "km" {
            calc = d / t
        } else {
            d = d / 1000
            calc = d / t
        }
        
        vMoyenne = calc
        
    }
    
    ...
    
    init() {
        }
    
}

**SpeedView.swift **

struct SpeedView: View {
    @ObservedObject var parameters = Parameters()
...
...
Button {
         showVMoy = true
         disableChange = true
                    
          if parameters.distance == nil {
              parameters.distance = 0
          } else {
            parameters.runCalc()
          }
                    
       } label: {
                    Text("Calculer")
                }
... *// Here I can show and see the calculated vMoyenne property without problem...*
...
}

And the PassageView.swift where I want to show the vMoyenne property...

struct PassageView: View {
    @ObservedObject var parameters:Parameters
    
    var body: some View {
        Text("\(parameters.vMoyenne)") *//want to show the vMoyenne value that we calculate previously but it always show 0,000...*
    }
}

Thanks a lot for your help !!

PS : I tried many things like using didSet but I don't understand what I did wrong... I found some post on stackoverflow but when I tried it doesn't work...

1

There are 1 best solutions below

1
On

If you update the ContentView to it should work. The problem was that the SpeedView and PassageView were not sharing the same parameters object

struct ContentView: View {
    @StateObject var parameters: Parameters = .init()

    var body: some View {
        TabView {
            SpeedView(parameters: parameters).tabItem {
                Label("Vitesse", systemImage: "figure.run.circle.fill")
            }

            PassageView(parameters: parameters).tabItem {
                Label("Passage", systemImage: "timer.circle.fill")
            }
        }
    }
}