swiftui - 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 更好的解决方案?
解决方案
你可以在你的 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")
})
}
}
推荐阅读
- c# - Microsoft.StreamProcessing 导致程序加载异常
- android - Android Gradle 插件仅支持 Kotlin Gradle 插件版本
- android - 来自意图共享 URI 的持久访问
- bash - 带有 AWK 输出到 CSV 的 Bash 脚本
- ios - 我在为 UITableView 单元缓存图像时做错了什么
- java - Discord bot 具有权限 ADMINISTRATOR 缺乏权限 MANAGE_CHANNEL
- ios - 我可以在 SwiftUI 中布局后获取“视图”的位置吗?
- python - 在 for 循环中追加不使用 DataFrame
- javascript - 如何在 Chrome 75 中加载外部源映射
- java - 无法安装断点 - Wildfly 远程调试/Eclipse