Не удается получить текст для обновления после изменения ползунка - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть пользовательский встроенный вид с текстом и ползунок, который привязывается к 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, когда я связываюсь со Слайдером.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

@ partha g - я все еще получал сообщение от XCode о том, что MyItem не соответствует Codable. Поэтому после некоторого копания я добавил пару inits и методы кодирования, чтобы все работало так, как я ожидал:

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

и вуаля.

Спасибо за вашу помощь!

0 голосов
/ 12 ноября 2019

С оболочками свойств, введенными в 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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...