我是SwiftUI的新手。尝试推进我的计时器应用程序时,我陷入了困境。
在ContentView中,我有两个ObservedObjects,一个用于管理计时器功能的Timer对象和一个用于存储所有用户设置的Settings对象。我的目标是,如果用户更改切换设置,则会在ContentView类中定义的MyTimer实例中设置一个变量。
我的问题是我不知道如何从“设置”类访问该实例。
这可能是一个非常简单的解决方案,但是,我试图在相当长的一段时间内使它正常工作,我很不走运。
感谢您的帮助!
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
}
}
...
}
答案 0 :(得分: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 :(得分: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
}