更新单独结构中的@AppStorage 后如何更新 SwiftUI 视图

Posted

技术标签:

【中文标题】更新单独结构中的@AppStorage 后如何更新 SwiftUI 视图【英文标题】:How to update SwiftUI view after @AppStorage in a separate struct gets updated 【发布时间】:2020-08-17 09:46:30 【问题描述】:

我有以下课程:

struct PriceFormatter 
    @AppStorage(UserDefaultsKey.savedCurrency)
    var savedCurrency: String?

    let price: Float
    
    init(price: Float) 
        self.price = price
    
    
    var formatted: String 
        return "\(savedCurrency) \(price)"
    

还有以下观点:

struct PriceText: View 
    let price: Float
    
    var body: some View 
        Text(PriceFormatter(price: self.price).formatted)
    

我希望在 savedCurrencyUserDefaults 更改之后重新渲染视图。

@AppStorage 是视图的一部分时,我让它很容易工作,但我不确定在这种情况下该怎么做。我尝试将@ObservableObject@Published 一起使用,或者尝试创建一个Combine Publisher 并订阅它,但也没有成功。

【问题讨论】:

@AppStorage 按设计在 View 中工作。 @Asperi 他们为什么要这样做? @Frankenstein。出于与@State 相同的原因... 提供一种简化的方式,在 UserDefaults 更改时动态更新视图...因此它们是动态属性包装器。 @Asperi 很有趣,在任何地方都没有看到这个。谢谢! 你做了什么来完成这项工作?这正是我想要实现的目标。 【参考方案1】:

更新

正如@Klaas 所指出的,从 ios 14.5 开始,人们可以在 ObservableObject (https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-14_5-release-notes) 中使用 @AppStorage

工作解决方案现在看起来像这样:

class PriceFormatter: ObservableObject 
    @AppStorage(UserDefaultsKey.savedCurrency)
    var savedCurrency: String?

    let price: Float
    
    init(price: Float) 
        self.price = price
    
    
    var formatted: String 
        return "\(savedCurrency) \(price)"
    

并像这样使用:

struct PriceText: View 
    @ObservedObject var formatter = PriceFormatter(price: 5)
    
    var body: some View 
        Text(formatter.formatted)
    

旧答案。适用于 iOS

正如@Asperi 所指出的那样,@AppStorage 只能在View 中使用。也隐式写在这里:https://developer.apple.com/documentation/swiftui/appstorage

【讨论】:

iOS 14.5 改变了这一点,见developer.apple.com/documentation/ios-ipados-release-notes/… @Klaas 太棒了,一旦我测试它就会更新答案。谢谢! 感谢您发布 iOS 14.5 更改,这是个好消息!

以上是关于更新单独结构中的@AppStorage 后如何更新 SwiftUI 视图的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:绑定到@AppStorage

SwiftUI @AppStorage 不在函数中刷新

使用 Apollo 执行突变后如何更新单独的组件道具

如何更新两个单独列表中的字典?

从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表

如何将更新的值传递到新的单独组件中?