【问题标题】:In a UIViewControllerRepresentable, how can I pass an ObservedObject's value to the view controller and update it every time the values changes?在 UIViewControllerRepresentable 中,如何将 ObservedObject 的值传递给视图控制器并在每次值更改时更新它?
【发布时间】:2020-02-26 07:45:53
【问题描述】:

我有一个订阅 ObservableObject 的 UIViewControllerRepresentable 结构,如下所示:

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 模式会更好

非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: ios swift observable swiftui combine


    【解决方案1】:

    updateUIViewController 应该在视图模型更新时调用,但是 SwiftUI 中存在一个错误 UIViewControllerRepresentableUIViewRepresentable 没有调用它。

    可以通过定义一个类并在可表示对象中创建它的实例来解决此问题。

    只需在chartVM 下添加以下内容即可开始工作:

    class RandomClass { }
    let x = RandomClass()
    

    【讨论】:

    • 感谢您的回答!我可以试一试,但我只是试了试。我尝试实施您提出的解决方法,但没有奏效。您的意思是在 chartVM 可观察对象的声明下添加它,对吧?我希望苹果能尽快解决这个问题......
    • @NolanMulder 是的,在声明下。您能否提供ChartViewModel metrics 声明的代码?如果它没有用@Published 修饰,那么它不会导致视图更新。
    • 我可以确认,使用其中的RandomClass 代码,updateUIViewController 被更频繁地调用。可以肯定地说,我自己是不会发现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多