当使用Combine更改viewModel时,为什么我的SwiftUI文本视图不会更新?

时间:2019-10-04 01:29:50

标签: watchkit swiftui combine

我正在使用SwiftUI和Combine创建一个新的watchOS应用,试图使用MVVM架构,但是当我的ViewModel更改时,我似乎无法在我的View中更新Text视图。

我正在使用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.0s也会增加一个新值。属性更新时,我尝试了objectWillChange.send(),但没有任何效果。

我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

目前,有一种解决方案是我幸运地通过实验找到的。我还没有找出背后的真正原因。在此之前,您只是不继承自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,建议您尝试使用链接问题中的一种解决方案。