struct WeakSelfBootcamp: View {
@AppStorage("count") var count: Int?
init() {
count = 0
}
var body: some View {
NavigationView {
NavigationLink("Navigate", destination: WeakSelfSecondScreen())
.navigationTitle("Screen 1")
}
.overlay(
Text("\(count ?? 0)")
.font(.largeTitle)
.padding()
.background(Color.green.cornerRadius(10))
, alignment: .topTrailing
)
}
}
struct WeakSelfSecondScreen: View {
@ObservedObject var vm = WeakSelfSecondScreenViewModel()
var body: some View {
VStack {
Text("Second View")
.font(.largeTitle)
.foregroundColor(.red)
Text(String(vm.data))
}
.onAppear{
vm.changeData()
}
}
}
class WeakSelfSecondScreenViewModel: ObservableObject {
@Published var data: Int = 0
init() {
print("INITIALIZE NOW")
let currentCount = UserDefaults.standard.integer(forKey: "count")
UserDefaults.standard.set(currentCount + 1, forKey: "count")
getData()
}
deinit {
print("DEINITIALIZE NOW")
let currentCount = UserDefaults.standard.integer(forKey: "count")
UserDefaults.standard.set(currentCount - 1, forKey: "count")
}
func changeData(){
data = data + 2
}
func getData() {
// DispatchQueue.main.asyncAfter(deadline: .now() + 500) { [weak self] in
// self?.data = "NEW DATA!!!!"
// }
self.data = 0
}
}
为什么这不起作用,它在屏幕上没有显示任何内容(预览),当我将observedObject更改为stateObject时,它正在工作,但每当我单击导航链接时,视图模型就会重新启动,但情况不应该是这样的
你能解释一下 stateObject 如何与 navigationLink 一起工作吗
为什么这不起作用,它在屏幕上没有显示任何内容(预览),当我将observedObject更改为stateObject时,它正在工作,但每当我单击导航链接时,视图模型就会重新启动,但情况不应该是这样的
你能解释一下 stateObject 如何与 navigationLink 一起工作吗
@StateObject
,因为您的视图(WeakSelfSecondScreen
)拥有WeakSelfSecondScreenViewModel
对象。仅当从某个其他视图注入该对象(即作为参数传递)并且另一个视图拥有该对象时,才可以使用 @ObservedObject
。@StateObject
重新初始化 vm
的情况下您看到的行为也是预期的。每次您点击“导航”时,它都应该重新初始化,因为视图是新打开的。也许您在某处了解到 @StateObject
保留状态,即重绘视图时,而不是重新初始化时。阅读整个线程,我猜您混淆了重新初始化视图和重新绘制视图的概念。这可能是一篇让您了解差异的好文章:https://www.avanderlee.com/swiftui/stateobject-observedobject-differences/