我有一个带有文本的自定义嵌入式视图和一个绑定到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中的文本。
答案 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() { }
}
还有瞧。
感谢您的帮助!