У меня есть два экрана: мастер и деталь, деталь имеет объект ObservedOb, который имеет свое состояние. Я также хочу скрыть панель навигации на мастере и показать ее подробно. Для этого у меня есть скрытое состояние панели навигации в виде свойства @State в главном представлении и отправка его обратно в подробный вид в качестве переменной Binding.
Проблема, с которой я столкнулся, заключается в том, что всякий раз, когда я обновляю эту переменную на подробном экране, 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 будет работать правильно, и текст будет обновлен.
Как мне добиться ожидаемого поведения, обновить панель навигации, сохраняя при этом мой наблюдаемый объект работающим?