【问题标题】:Why won't my SwiftUI Text view update when viewModel changes using Combine?当 viewModel 使用 Combine 更改时,为什么我的 SwiftUI Text 视图不会更新?
【发布时间】:2020-02-02 08:12:51
【问题描述】:

我正在使用 SwiftUI 创建一个新的 watchOS 应用程序,并尝试使用 MVVM 架构,但是当我的 viewModel 更改时,我似乎无法在我的视图中更新文本视图。

我正在使用 watchOS 6、SwiftUI 和 Combine。当我认为应该使用 @ObservedObject 和 @Published 时,我正在使用它们,但更改并没有像我预期的那样反映出来。

// Simple ContentView that will push the next view on the navigation stack
struct ContentView: View {
    var body: some View {
        NavigationLink(destination: NewView()) {
            Text("Click Here")
        }
    }
}

struct NewView: View {
    @ObservedObject var viewModel: ViewModel

    init() {
        viewModel = ViewModel()
    }

    var body: some View {
        // This value never updates
        Text(viewModel.str)
    }
}

class ViewModel: NSObject, ObservableObject {
    @Published var str = ""
    var count = 0

    override init() {
        super.init()

        // Just something that will cause a property to update in the viewModel
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
            self?.count += 1
            self?.str = "\(String(describing: self?.count))"

            print("Updated count: \(String(describing: self?.count))")
        }
    }
}

Text(viewModel.str) 从不更新,即使 viewModel 每 1.0 秒递增一个新值。我在属性更新时尝试过objectWillChange.send(),但没有任何效果。

我做错了什么吗?

【问题讨论】:

  • 好吧,除非您的 Timer 被提前释放,否则应该可以。保持对计时器对象的强引用,这应该可以解决问题。 See this
  • 定时器不会消失。在本例中,它将无限期地打印到控制台。

标签: watchkit swiftui combine


【解决方案1】:

目前,我幸运地通过实验找到了一个解决方案。我还没有弄清楚这背后的真正原因。在那之前,你只是不继承 NSObject 并且一切都应该正常工作。

class ViewModel: ObservableObject {
    @Published var str = ""
    var count = 0

    init() {

        // Just something that will cause a property to update in the viewModel
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
            self?.count += 1
            self?.str = "\(String(describing: self?.count))"

            print("Updated count: \(String(describing: self?.count))")
        }
    }
}

我已经对此进行了测试,并且可以正常工作。


A similar question 还解决了发布者对象是NSObject 的子类的问题。因此,您可能需要重新考虑是否真的需要 NSObject 子类。如果您无法摆脱NSObject,我建议您尝试链接问题中的解决方案之一。

【讨论】:

  • 哇。这固定了我的例子!谢谢。
  • 我遇到了类似的问题。在我的例子中,我点击了一个 webservice onAppear 视图并根据服务的响应编辑属性。我看到 ViewModel 的属性正在使用新值更新,但视图没有更新。我的 VieModel 也不是 NSObject 的子类。 MyViewModel 有一个属性,它是 Observable 对象的一个​​实例。是否还有其他我遗漏的注意事项?
猜你喜欢
  • 2021-09-23
  • 2021-08-20
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多