更改滑块后无法更新文本
Posted
技术标签:
【中文标题】更改滑块后无法更新文本【英文标题】:Can't get Text to update after changing slider 【发布时间】:2019-11-12 00:39:41 【问题描述】:我有一个自定义的嵌入视图,其中包含文本和一个绑定到 ObservedObject 的滑块。我可以通过更改滑块成功更新绑定,但文本没有更新。出于某种原因,我真的很难掌握 Property Wrappers 的窍门,并希望最终得到点击。
当我将滑块值绑定到本地状态时,我可以轻松更新文本,但绑定没有运气。
class MyItem:ObservableObject, Codable, Identifiable
enum CodingKeys: String, CodingKey
case calories
var didChange = PassthroughSubject<Void,Never>()
var id = UUID()
var calories:Double = 0 didSet update()
func update()
didChange.send()
struct ContentView:View
@ObservedObject var item = MyItem()
var body:some View
MySlider(value: $item.calories)
struct MySlider:View
@Binding var value:Double
var body:some View
VStack
Text("\(value) ")
Slider(value: $value, in: 0...2000, step:5)
一切正常,但我无法让 MySlider 中的文本更新,因为我弄乱了 Slider。
【问题讨论】:
【参考方案1】:使用 Swift 5.1 中引入的属性包装器,我们可以使用 @Published
来简化状态传播。我将你的重构为用户@Published
。对于提到的场景,这应该有效。
class MyItem: ObservableObject, Codable, Identifiable
enum CodingKeys: String, CodingKey
case id
case calories
var id = UUID()
@Published var calories: Double = 0
struct ContentView:View
@ObservedObject var item = MyItem()
var body:some View
MySlider(value: $item.calories)
struct MySlider:View
@Binding var value:Double
var body:some View
VStack
Text("\(value) ")
Slider(value: $value, in: 0...2000, step:5)
【讨论】:
抱歉,我打算让 MyItem 可编码,因为这将通过 JSON 发送到服务。由于需要可编码,@Published 不符合 Codable。 我专注于滑块以找出为什么它没有根据标题更新。更新了代码。 Slider 现在正在更新文本。 @manotype。让我知道这对你有用【参考方案2】:@partha g — 我仍然收到来自 XCode 的消息,说 MyItem 不符合 Codable。因此,经过一番挖掘,我添加了几个 inits 和 encode 方法,以使一切按我预期的方式工作:
class MyItem: ObservableObject, Codable, Identifiable
[...]
func encode(to encoder:Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(calories, forKey: .calories)
required init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
calories = try container.decode(Double.self, forKey: .calories)
init()
瞧瞧。
感谢您的帮助!
【讨论】:
以上是关于更改滑块后无法更新文本的主要内容,如果未能解决你的问题,请参考以下文章