Как исправить ошибку полузакрытого просмотра SwiftUi - PullRequest
1 голос
/ 27 мая 2020

У меня есть RootView с .navigationBarHidden(hideBar) (@State var hideBar = true) и ChildView с .simultaneousGesture(TapGesture().onEnded { self.hideBar = false }), что заставляет RootView автоматически устанавливать hideBar на false после перехода. Поскольку я не хочу, чтобы на моем RootView была панель навигации, я установил .onAppear {self.hideBar = true}.

Проблема в том, что когда я делаю жест смахивания вправо (from ChildView back to RootView), даже хотя я не полностью смахиваю (<половина) до <code>RootView, он все равно автоматически устанавливает hideBar back to true, скрывая backbutton и navbar на ChildView.

Есть какие-то идеи как справиться с этой проблемой? Был бы признателен за любую помощь!

Вот мой код:

struct ExploreView: View {

     @State private var hideBar = true

    var body: some View {
        
        VStack{
            HStack{

                       
                    NavigationLink(destination:MessagesView()){

                         Image("messages")
                        
                      }.simultaneousGesture(TapGesture().onEnded {
                         self.hideBar = false     
                      })
                .foregroundColor(Color("blackAndWhite"))

            }.padding(EdgeInsets(top: 5, leading: 20, bottom: 0, trailing: 20))                
                 

        }
         .navigationBarTitle(Text(""), displayMode: .inline)
        .navigationBarHidden(hideBar)
         .onAppear {
          self.hideBar = true  // hides on back
         }
 
            
    }
}

Вот TabBarView:

struct TabBarView: View {

    
    @State var selection: Int = 0
    @State var index: Int = 0

    var body: some View {
          ZStack{
            GeometryReader { geometry in
                
        NavigationView{
                TabView(selection: self.$selection){
                        
                          ExploreView()
                        
//                          .navigationBarHidden(true)
                        
                          .tabItem{
                            VStack{
                                Image("clostNav").renderingMode(.template)
                                                            
                                                           
                                Text("Explore")
                            
                            }.foregroundColor(Color("blackAndWhite"))
                            
                             
                              
                              
                    }.tag(0)
                    
                    SearchView()
                        .navigationBarTitle(Text(""), displayMode: .inline)
                       .navigationBarHidden(true)
                        .tabItem{
                             
                              Image("search").renderingMode(.template)
                              Text("Search")
                       }.tag(1)
                          
                       PostView()
                       .navigationBarTitle(Text(""), displayMode: .inline)
                        .navigationBarHidden(true)
                       .tabItem{
                           HStack{
                              
                                  Image("post").renderingMode(.template)
                                .resizable().frame(width: 35, height: 35)
                                
                            
                              }
                              
                          }.tag(2)

                          OrdersView()
                            .navigationBarTitle(Text(""), displayMode: .inline)
                            .navigationBarHidden(true)
                          .tabItem{
                              
                              Image("orders").renderingMode(.template)
                              Text("Orders")

                             
                                

                          }.tag(3)
                   
                        ProfileView()
//                    .navigationBarTitle(Text(""), displayMode: .inline)
//                    .navigationBarHidden(true)
                          
                          
                            
                          .tabItem{
                              
                             Image("profile").renderingMode(.template)
                              
                              Text("Profile")
   
                          }.tag(4)
                    
                  }
                
               }.accentColor(Color("redMain"))
            
                .opacity(self.selection == 2 ? 0.001 : 1)
                PostView()
                    .offset(x: geometry.size.width / 2 - 30, y: geometry.size.height - 80)
                    .onTapGesture {
                        self.selection = 0
                }
                .opacity(self.selection == 2 ? 1 : 0)
                
            }
        }
    }
        
}

Пояснение:

Я поставил Tabbar{} внутри NavigationView, чтобы bottomTabbar скрывался после NavigationLink от ExploreView до MessagesView.

Повторяю мою проблему:

Когда вы нажимаете NavLink на MessagesView, все работает отлично, но при смахивании вправо немного закрыть MessagesView (.onAppear {self.hideBar = true} запускает и скрывает NavBar в MessagesView даже я еще не закрыл).

1 Ответ

1 голос
/ 27 мая 2020

Используйте onDisappear вот так и удалите одновременный жест, тогда это сработало для меня:

struct ExploreView: View {

    @State private var hideBar = true

    var body: some View {

        VStack{
            HStack{
                NavigationLink(destination:EmptyView()){
                    Image(systemName: "mic")
                }
            }.padding(EdgeInsets(top: 5, leading: 20, bottom: 0, trailing: 20))
        }
        .navigationBarTitle(Text(""), displayMode: .inline)
        .navigationBarHidden(hideBar)
        .onAppear {
            self.hideBar = true  // hides on back
        }
        .onDisappear {
            self.hideBar = false
        }
    }
}
...