![](/img/trans.png)
[英]SwiftUI doesn't update UI with ObservedObject in nested NavigationLink destination
[英]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.