1

I'm working with UserDefaults im my ViewModel:

class SettingsViewModel: ObservableObject {

private let cancellable: Cancellable
private let defaults: UserDefaults
let objectWillChange = PassthroughSubject<Void, Never>()


private enum Keys {
    static let channel1Value = "channel1_value"
    static let channel2Value = "channel2_value"
}


var channel1Value : Double
{
    set{ defaults.set(newValue, forKey: Keys.channel1Value)}
    get {defaults.double(forKey: Keys.channel1Value)}
}
var channel2Value : Double
{
    set{ defaults.set(newValue, forKey: Keys.channel2Value)}
    get {defaults.double(forKey: Keys.channel2Value)}
}


init(defaults: UserDefaults = .standard) {
    self.defaults = defaults
    
    defaults.register(defaults: [
        Keys.channel1Value : 95,
        Keys.channel2Value : 95
     ])
    
    cancellable = NotificationCenter.default
        .publisher(for: UserDefaults.didChangeNotification)
        .map { _ in () }
        .subscribe(objectWillChange)
}

func resetDefaultsValue() {
    
    channel2Value = 95
    channel1Value = 95
} }

In my View:

struct SliderView: View {
@StateObject var vm: vm = SettingsViewModel()
var body: some View {
        HStack {
            Text("Text")
                .frame(width: 100, alignment: .leading)
                
            Slider(value: $vm.sliderValue, in: 0...100, step: 1){
                Text("Text")
            }.padding(.trailing,10) }
    } }

On the line where the UserDefaults ist registered this warning occurs. "defaults.register(defaults: ["

[SwiftUI] Publishing changes from within view updates is not allowed, this will cause undefined behavior.

What should I modify?

Jameel
  • 1,126
  • 1
  • 14
  • 27
  • That `ObservableObject` has a few mistakes, e.g. `objectWillChange` needs to be set to a notification center publisher. But why don't you give `@AppStorage` a try? - it does all the hard work for you. – malhal Feb 07 '23 at 16:54

0 Answers0