SwiftUI onAppear только изменяет @State каждый второй раз с @Binding - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующий код:

struct ContentView: View {

    @State public var navBarHidden = true

    var body: some View {

        NavigationView{
            VStack{
                ZStack(alignment: .center){
                    View1().onAppear{self.navBarHidden = true}
                    View2()
                    View3(navBarHidden: $navBarHidden)
                }.navigationBarTitle("").navigationBarHidden(self.navBarHidden)
            }
        }
    }
}


//View3
struct View3: View {

    @Binding public var navBarHidden: Bool

    var body: some View {

        NavigationView{
            VStack{
                MenuButton(buttonText: "Settings", buttonCallView: AnyView(SettingsView() .navigationBarTitle(Text("Settings"), displayMode: .inline)))
                        .simultaneousGesture(TapGesture().onEnded {
                           self.navBarHidden = false
                        })
            }
        }
    }
}

//Menu Button
struct MenuButton: View {

    var buttonText: String
    var buttonCallView: AnyView

    var body: some View {
        NavigationLink(destination: self.buttonCallView) {
            Text(self.buttonText)
            }.padding()

    }
}

Это нормально работает для панели навигации, которая появляется после того, как я нажимаю эту кнопку MenuButton, но когда возвращаюсь, и .onAppear из View1 должен Срабатывает, он только меняет @State каждый раз, когда я возвращаюсь из Подменю, которое вызывает Кнопка Меню. Я пробовал print("one") в .onAppear, и это печатается каждый раз. Я ожидаю, что это будет некоторый «поздний» ответ: .onAppear.

У меня есть обходной путь. Добавляя .onDisappear к представлению, кнопка вызывает ее работу. Но это не идеально.

MenuButton(buttonText: "Settings", buttonCallView: AnyView(Settings().onDisappear{self.navBarHidden = true}.navigationBarTitle(Text("Settings"), displayMode: .inline)))
                        .simultaneousGesture(TapGesture().onEnded {
                            self.navBarHidden = false
                        })
...