簡體   English   中英

如果父對象有更新,則 ObservedObject 無法處理 NavigationLink 的目標

[英]ObservedObject not working on NavigationLink's destination if there are updates on parent

我有兩個屏幕,一個主屏幕和一個細節,細節有一個具有狀態的 ObservedObject。 我還想隱藏 master 上的導航欄並詳細顯示它。 為此,我將導航欄隱藏狀態作為主視圖上的 @State 屬性,並將其作為綁定變量發送回詳細視圖。

我遇到的問題是,每當我在詳細信息屏幕內更新該變量時,ObservedObject 就會停止工作。

這是重現該問題的示例代碼:

struct ContentView: View {
    @State var navigationBarHidden = true

    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView(navigationBarHidden: $navigationBarHidden)) {
                    Text("Go Forward")
                }
            }
            .navigationBarTitle("", displayMode: .inline)
            .navigationBarHidden(navigationBarHidden)
            .onAppear { self.navigationBarHidden = true }
        }
    }
}

class DetailViewModel: ObservableObject {
    @Published var text = "Didn't work"
}

struct DetailView: View {
    @Binding var navigationBarHidden: Bool
    @ObservedObject var viewModel = DetailViewModel()

    var body: some View {
        VStack {
            Text(viewModel.text)
        }.onAppear {
            self.navigationBarHidden = false
            self.viewModel.text = "Worked"
        }
    }
}

如果我保持原樣,文本將不會更新為“工作”。 如果我刪除self.navigationBarHidden = false ,則 ObservedObject 將正常工作並且文本將更新。

我怎樣才能達到預期的行為,在保持我觀察到的對象工作的同時更新導航欄?

原因是,那

NavigationLink(destination: DetailView(navigationBarHidden: $navigationBarHidden)) {
    Text("Go Forward")
}

激活時創建新的 DetailView 等新的 DetailViewModel

嘗試

import SwiftUI

struct ContentView: View {
    @State var navigationBarHidden = true
    @ObservedObject var viewModel = DetailViewModel()
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView(navigationBarHidden: $navigationBarHidden).environmentObject(viewModel)) {
                    Text("Go Forward")
                }
            }
            .navigationBarTitle("", displayMode: .inline)
            .navigationBarHidden(navigationBarHidden)
            .onAppear { self.navigationBarHidden = true }
        }
    }
}

class DetailViewModel: ObservableObject {
    @Published var text = "Didn't work"
}

struct DetailView: View {
    @Binding var navigationBarHidden: Bool
    @EnvironmentObject var viewModel: DetailViewModel

    var body: some View {
        VStack {
            Text(viewModel.text)
        }.onAppear {
            self.navigationBarHidden = false
            self.viewModel.text = "Worked"
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

現在您與 DetailView 共享模型,它按預期工作(編寫)

如果我刪除 self.navigationBarHidden = false 行,ObservedObject 將正常工作並且文本將更新。

如果刪除此行,則不會重新創建 DetailView(View 中沒有任何更改)狀態不是 View 狀態的一部分,它是引用類型,因此 SwiftUI 不會看到任何更改,直到由它們包裝的某些值發生更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM