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 计算属性显示“在视图更新期间修改状态,这将导致未定义的行为。”错误