Search code examples
swiftuigesturetabbar

onTapGesture is not working in TabView, how to make it work?


I used the .onTapGesture in TabView but it is not working. It also affecting the tab bar functionality.

TabView{
}
.onTapGesture {
            <#code#>
        }

Solution

  • Instead of using onTapGesture on tabView we can write an extension to Binding and it will detect the new tab selection value even if we tap the tab bar within the same tab it will detect the changes. Here I am provided the binding extension.

    extension Binding {
    func onUpdate(_ closure: @escaping () -> Void) -> Binding<Value> {
        Binding(get: {
            wrappedValue
        }, set: { newValue in
            wrappedValue = newValue
            closure()
        })
    }}
    

    I used this in my tabView. I attached my code below.

    TabView(selection: $tabSelection.onUpdate {
            setNewValue(value: tabSelection)
        }) {
          ContentView()
            .tabItem {
                    Label {
                        Text("Home")
                    } icon: {
                        Image("HomePage_icon")
                            .renderingMode(.template)
                    }
                }
                .tag(TabViews.homepage)
    }
    

    SetNewValue function, this function acts like onTapGesture

    func setNewValue(value: TabViews){
         self.tabSelection = value
         */ inside this function we can write the code, we like to write it in onTapGesture */
     }