gpt4 book ai didi

ios - 如果父项有更新,ObservedObject 无法在 NavigationLink 的目的地上工作

转载 作者:行者123 更新时间:2023-12-01 19:35:00 24 4
gpt4 key购买 nike

我有两个屏幕,一个主屏幕和一个详细信息,详细信息有一个 ObservedObject 有它的状态。我还想隐藏 master 上的导航栏并详细显示它。为此,我将导航栏隐藏状态作为主视图上的 @State 属性,并将其作为绑定(bind)变量发送回详细 View 。

我遇到的问题是,每当我在详细信息屏幕中更新该变量时,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 共享模型,它按预期工作(书面)

If I remove the line self.navigationBarHidden = false, the ObservedObject will work properly and the text will update.



如果删除此行,则未重新创建的 DetailView(View 中没有任何更改)状态不是 View 状态的一部分,它是引用类型,因此 SwiftUI 不会看到任何更改,直到它们包装的某些值发生更改。

关于ios - 如果父项有更新,ObservedObject 无法在 NavigationLink 的目的地上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60564628/

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