我正在使用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()
,但没有任何效果。
我做错什么了吗?
[很幸运,我只是通过实验找到了一个解决方案。我还没有找出背后的真正原因。在那之前,您只是不继承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
,建议您尝试使用链接问题中的一种解决方案。