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

5
我正在使用SwiftUI和Combine创建一个新的watchOS应用程序,尝试使用MVVM架构,但是当我的viewModel更改时,我似乎无法使视图中的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.0秒递增一个新值。我已经尝试在属性更新时使用objectWillChange.send(),但什么都没有发生。

我做错了什么吗?


1
这应该可以工作,除非您的 Timer 过早地被释放。保持对计时器对象的强引用,那就可以解决问题了。请参阅此处 - nayem
计时器不会消失。在这个例子中,它将无限期地打印到控制台。 - lepolt
1个回答

4

暂时有一个解决方法,我通过实验幸运地找到了。 我还没有找到背后的真正原因。 在那之前,您只需不继承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))")
        }
    }
}

我已测试过这个方法,它可以工作。


一个类似的问题 也讨论了出版者对象是NSObject子类的问题。所以你可能需要重新考虑是否真的需要一个NSObject子类。如果你无法避免使用NSObject,建议你尝试链接问题中提供的解决方法之一。


哇,这解决了我的问题!谢谢。 - lepolt
我遇到了类似的问题。在我的情况下,我在视图的onAppear上调用了一个Web服务,并根据服务的响应编辑属性。我看到ViewModel的属性正在更新为新值,但视图没有得到更新。我的ViewModel也没有从NSObject子类化。MyViewModel具有一个Observable对象实例的属性。我是否忽略了其他任何考虑因素? - Dinakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接