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

问题描述 投票:4回答:1

我正在使用SwiftUI和Combine尝试使用MVVM架构创建一个新的watchOS应用,但是当我的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(),但没有任何效果。

我做错什么了吗?

watchkit swiftui combine
1个回答
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,建议您尝试使用链接问题中的一种解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.