I am creating a Mac-App. When it is launched multiple times all windows should access the same application-state (theAppState) but each window should display its own data (of kind MyClass).
As is shown below, when the MainWindow creates the MyClass-object it passes the binding to theAppState.
The MainWindow has a button that invokes obj.incBoth(). As a result, theAppState is increased (as it should).
The body shows theAppState in the different ways:
self.appStateis displayed correctly and it is increased on each button press.obj.appstateis not displayed correctly (the original value 42 is always shown)obj.appstate()is not displayed correctly (same as obj.appstate)
Pleaase help me understand this strange behaviour!
import SwiftUI
class MyClass : ObservableObject {
@Published var x = 0
@Binding var appstate : Int
init(appstate : Binding<Int> ){
self._appstate = appstate
}
func appstate2() -> Int {
return self.appstate
}
func incBoth() {
x+=1
appstate += 1
print("x=\(x) appstate=\(appstate)")
}
}
struct MainView : View {
@Binding var appState : Int
@StateObject var obj : MyClass
init(appstate: Binding<Int>){
self._appState = appstate
self._obj = StateObject(wrappedValue: MyClass(appstate: appstate))
}
var body: some View {
Text("appState = \(appState), obj.appstate = \(obj.appstate), obj.appstate2 = \(obj.appstate2()) obj.x = \(obj.x)")
Button("Inc") {
obj.incBoth()
}
}
}
@main
struct ProblemApp : App {
@State private var theAppState = 42
var body: some Scene {
WindowGroup {
MainView(appstate: $theAppState)
}
}
}




