SwiftUI如何从另一个类中访问ContentView变量。

问题描述 投票:1回答:1

我是SwiftUI的新手。试图推进我的Timer应用,我卡住了。

在我的ContentView中,我有两个ObservedObjects,Timer对象管理定时器功能,Settings对象存储所有用户设置。我的目标是,如果用户改变了切换设置,在ContentView类中定义的MyTimer实例中就会设置一个变量。

我的问题是,我不知道如何从类Settings中访问该实例。

这可能是一个非常简单的解决方案,然而,我试图让这个工作已经有一段时间了,我的运气不好。

谢谢你的帮助


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

              }
          }
...

}

swift class variables swiftui instance-variables
1个回答
1
投票

我不明白你的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") }
        }
    }
}

1
投票

这里有一个可能的替代方案,只是更简单(你也可以将.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

}
© www.soinside.com 2019 - 2024. All rights reserved.