更改滑块后无法更新文本

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()  

瞧瞧。

感谢您的帮助!

【讨论】:

以上是关于更改滑块后无法更新文本的主要内容,如果未能解决你的问题,请参考以下文章

根据其输出更新滑块输入默认值

无法从文本框中获取更新的值

Kivy:无法从另一个类更新文本输入值

传递新数据时无法更新图形(“动态图”)

反应:带有自定义钩子的滑块无法正常工作

更改另一个滑块时更新材质滑块 UI