SwiftUI 如何从另一个访问 ContentView 变量 class

SwiftUI how to access ContentView variables from another class

我是 SwiftUI 的新手。试图推进我的计时器应用程序,我被卡住了。

在我的 ContentView 中,我有两个 ObservedObjects,管理计时器功能的 Timer 对象和存储所有用户设置的 Settings 对象。我的目标是,如果用户更改切换设置,则会在 ContentView class.

中定义的 MyTimer 实例中设置一个变量

我的问题是我不知道如何从 class 设置访问该实例。

这可能是一个非常简单的解决方案,但是,我已经尝试让它工作了很长一段时间,但我很不走运。

感谢您的帮助!


struct ContentView: View {

    @ObservedObject var myTimer = MyTimer()
    @ObservedObject var settings = Settings()

...

 Toggle(isOn: self.$settings.muteInSilenceMode) {
        Text("Mute sound in silence mode")
                                    }
...

}

class Settings: ObservableObject {

...

    @Published var muteInSilenceMode: Bool = UserDefaults.standard.bool(forKey: "muteInSilenceMode"){
              didSet{
                  UserDefaults.standard.set(self.muteInSilenceMode, forKey: "muteInSilenceMode"

                  // I want to access the Timer object from here

              }
          }
...

}

我看不出您的 Settings() 与您的问题有什么关系,但我认为您的问题的答案如下所示:

struct ContentView : View {

    @ObservedObject var myTimer = MyTimer()
    @ObservedObject var settings = Settings()

    @State private var timer: Bool

    var body: some View {

        let toggleTimer = Binding<Bool> (
            get: { self.timer},
            set: { newValue in
                self.timer = newValue
                if self.timer {
                    myTimer.theVaribableYouWantToChange = true // Didn't know the name of your variable.
                } else {
                    // Whatever shall happen if the Toggle gets deactivated.
                }
        })

        return HStack {
            Toggle(isOn: toggleTimer) {Text("Activate") }
        }
    }
}

这是可能的替代方法,只是更简单(您也可以将 .onReceive 附加到任何其他内部视图)。

struct ContentView: View {

    @ObservedObject var myTimer = MyTimer()
    @ObservedObject var settings = Settings()

   // ... other code here

    Toggle(isOn: self.$settings.muteInSilenceMode) {
        Text("Mute sound in silence mode")
    }
    .onReceive(self.settings.$muteInSilenceMode) { mute in
        self.myTimer.doSomething(with: mute) // << eg., do anything needed
    }

   // ... other code here

}