更改滑块后无法更新文本

时间:2019-11-12 00:39:41

标签: swiftui

我有一个带有文本的自定义嵌入式视图和一个绑定到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)
        }
    }
}

一切正常,但是当我弄乱Slider时,我无法更新MySlider中的文本。

2 个答案:

答案 0 :(得分:0)

借助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)
        }
    }
}

答案 1 :(得分:0)

@partha g-我仍然从XCode收到一条消息,说MyItem不符合Codable。因此,在进行了一些挖掘之后,我添加了一些init并编码了一些方法,以使一切按预期的方式工作:

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

还有瞧。

感谢您的帮助!