gpt4 book ai didi

watchkit - 为什么我的 SwiftUI TextView 在使用组合更改 viewModel 时不会更新?

转载 作者:行者123 更新时间:2023-12-03 16:38:15 27 4
gpt4 key购买 nike

我正在使用 SwiftUI 创建一个新的 watchOS 应用程序并尝试使用 MVVM 架构,但是当我的 viewModel 更改时,我似乎无法在我的 View 中更新 TextView 。

我正在使用 watchOS 6、SwiftUI 和结合。当我认为应该使用 @ObservedObject 和 @Published 时,我正在使用它们,但更改没有像我期望的那样反射(reflect)出来。

// 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))")
}
}
}

我已经测试过这个并且它有效。

A similar question还解决了发布者对象是 NSObject 的子类的问题。 .因此,您可能需要重新考虑是否真的需要 NSObject子类与否。如果你离不开 NSObject ,我建议您尝试链接问题中的解决方案之一。

关于watchkit - 为什么我的 SwiftUI TextView 在使用组合更改 viewModel 时不会更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58228777/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com