SwiftUI 中已发布的计算属性未更新

Posted

技术标签:

【中文标题】SwiftUI 中已发布的计算属性未更新【英文标题】:Published computed property in SwiftUI is not updating 【发布时间】:2020-12-28 14:58:54 【问题描述】:

我有一堂课:

    class ItemController: ObservableObject 
    init() 
        self.current = 0 // The first object of the array by default
        self.itemPrices = [1000, 1200, 1320, 1000, 1200, 1320, 2000, 2300] // The array itself
        thePrice = 
            return self.itemPrices[self.current % 8] // Here's the computed property I want to work and by updated by a function
        
    
   
    var current: Int // Simply the current object of the array
    let itemPrices: [Int] // The array I initialised higher
    @Published public var thePrice: () -> Int = return 0 // The computed property 

    func moveItem()  // this function should change the "current" while other @Published stuff changes automatically 
        self.current += 1
        print(self.itemPrices[current])
    

还有一个类似的视图:

struct ContentView: View 
    var item = ItemController()
    var body: some View 
        Text(String(self.item.thePrice()))
        Button("next")  item.moveItem()  // this button starts the function
    

当我按下按钮时,文本应该会改变,但实际上并没有改变,虽然基本上看起来是正确的。

【问题讨论】:

【参考方案1】:

您发布的不是计算属性,而是一个函数,因此要发布更新,您需要为该属性分配一个新函数,这不是您想要的。

让您发布的属性直接保留价格,并在moveItem 方法中进行修改。

 @Published var price: Int

将您的初始化更改为

init() 
    self.current = 0
    self.itemPrices = [1000, 1200, 1320, 1000, 1200, 1320, 2000, 2300]
    price = itemPrices[current]

然后更新moveItem。请注意,您需要检查 index out of bounds 错误,所以我添加了一个简单的建议

func moveItem() 
    self.current += 1
    if current >= itemPrices.count  current == 0 
    price = itemPrices[current]

【讨论】:

是的,它有帮助,但我完全忘记将 @ObservedObject 包装器添加到我的“项目”中 @XDme 啊,是的,我忘了我也对视图代码进行了更改

以上是关于SwiftUI 中已发布的计算属性未更新的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 计算属性显示“在视图更新期间修改状态,这将导致未定义的行为。”错误

SwiftUI 中的计算(NSObject)属性不会更新视图

SwiftUI 基于计算属性显示警报

已发布的属性未在 SwiftUI 中更新

SwiftUI - @State 属性未更新

计算属性未在道具更改时更新