observedObject 与 stateObject 行为

问题描述 投票:0回答:1
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 一起工作吗

swift swiftui swiftui-navigationlink observedobject
1个回答
0
投票
  1. 您必须在您的情况下使用
    @StateObject
    ,因为您的视图(
    WeakSelfSecondScreen
    )拥有
    WeakSelfSecondScreenViewModel
    对象。仅当从某个其他视图注入该对象(即作为参数传递)并且另一个视图拥有该对象时,才可以使用
    @ObservedObject
  2. @StateObject
    重新初始化
    vm
    的情况下您看到的行为也是预期的。每次您点击“导航”时,它都应该重新初始化,因为视图是新打开的。也许您在某处了解到
    @StateObject
    保留状态,即重绘视图时,而不是重新初始化时。阅读整个线程,我猜您混淆了重新初始化视图和重新绘制视图的概念

这可能是一篇让您了解差异的好文章:https://www.avanderlee.com/swiftui/stateobject-observedobject-differences/

© www.soinside.com 2019 - 2024. All rights reserved.