为什么在使用 Combine 更改 viewModel 时我的 SwiftUI 文本视图不会更新?
Why won't my SwiftUI Text view update when viewModel changes using Combine?
我正在使用 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()
,但没有任何效果。
我做错了什么吗?
目前,有一个解决方案是我通过试验幸运地找到的。我还没有找出这背后的真正原因。在那之前,您只是不从 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
,我建议您尝试链接问题中的一种解决方案。
我正在使用 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()
,但没有任何效果。
我做错了什么吗?
目前,有一个解决方案是我通过试验幸运地找到的。我还没有找出这背后的真正原因。在那之前,您只是不从 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
,我建议您尝试链接问题中的一种解决方案。