首页 > 解决方案 > iOS 13.4:使用 toggle() 时不再为 @Published Bool 调用 didSet()

问题描述

在 iOS 13.4 之前,我使用属性观察器来更新 @Published Bool 值的 UserDefaults

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

在 iOS 13.4 的第一个测试版中,如果我在 SwiftUI 中使用 toggle() 方法,就不再调用 didSet() 了,我必须使用逻辑否定:

Button(action: {  
    // self.settings.mutedAudio.toggle()  doesn't work in iOS 13.4  
    self.settings.mutedAudio = !self.settings.mutedAudio // workaround  
}) {  
    Image(systemName: settings.mutedAudio ? "speaker.slash.fill" : "speaker.2.fill").resizable().frame(width: 24, height: 24)  
}

有没有比等待下一个 iOS 13.4 beta 更好的解决方案?

标签: swiftui

解决方案


你可以在你的 init 或者其他地方直接订阅mutedAudio,例如:

class SomeClass: ObservableObject {
    var cancellable: Cancellable?

    @Published var mutedAudio: Bool = UserDefaults.standard.bool(forKey: "mutedAudio")

    init() {
        cancelable = $mutedAudio.sink(receiveValue: { (value) in
            UserDefaults.standard.set(value, forKey: "mutedAudio")
        })
    }
}

推荐阅读