Как в UIViewControllerRepresentable передать значение ObservedObject контроллеру представления и обновлять его каждый раз при изменении значений?

У меня есть структура UIViewControllerRepresentable, которая подписана на ObservableObject, например:

struct ViewControllerWrapper: UIViewControllerRepresentable {
@ObservedObject var chartVM = ChartViewModel()

typealias UIViewControllerType = ViewController


func makeUIViewController(context: Context) -> ViewController {
    let lineChartView = LineChartView()
    let vc = ViewController(lineChartView: lineChartView)
    return vc
}

func updateUIViewController(_ uiViewController: ViewController, context: Context) {
    uiViewController.metrics = chartVM.metrics
    uiViewController.setChartValues()
}
}

Я бы хотел, чтобы при изменении ObservedObject либо вызывается updateUIViewController, либо другая функция, которая обновляет массив metrics контроллера представления и вызывает его метод setChartValues().

Как я могу это сделать? Я не могу найти один

Я всегда могу это сделать, как мы привыкли использовать только UIKit, но было бы гораздо лучше сделать это с использованием этого шаблона MVVM.

Помощь будет очень признательна, спасибо!


person Nolan Mulder    schedule 30.10.2019    source источник


Ответы (1)


updateUIViewController следует вызывать при обновлении модели представления, однако есть ошибка в SwiftUI UIViewControllerRepresentable и UIViewRepresentable, где она не вызывается.

Это можно обойти, определив класс и создав его экземпляр внутри представляемого объекта.

Просто добавьте следующее в chartVM, и он должен начать работать:

class RandomClass { }
let x = RandomClass()
person Vlad    schedule 30.10.2019
comment
Спасибо за ваш ответ! Я мог попробовать, но я только что сделал. Я попытался реализовать предложенный вами обходной путь, но это не сработало. Вы хотели добавить это в объявление наблюдаемого объекта chartVM, верно? Надеюсь, Apple скоро это исправит ... - person Nolan Mulder; 07.11.2019
comment
@NolanMulder да по объявлению. Можете ли вы предоставить код для объявления ChartViewModel metrics? Если он не украшен @Published, это не приведет к обновлению представления. - person Vlad; 11.11.2019
comment
Я могу подтвердить, что с кодом RandomClass там updateUIViewController звонят чаще. Можно с уверенностью сказать, что я бы не нашел этого самостоятельно. - person Andrew Duncan; 10.03.2020