10

I've just added TabView, which is working fine, but I unable to fetch the selected tab index out if it.
I think I've kept my code perfectly fine, not sure what's wrong.

struct DefaultTabbar: View {
    
    @State private var selectedItem = 1
    
    var body: some View {
        TabView(selection: $selectedItem) {
            FirstView()
                .tabItem{
                    Image(systemName: "house")
                    Text("First Tab")
            }
            .tag(1)
            
            SecondView()
                .tabItem{
                    Image(systemName: "photo")
                    Text("Second Tab")
            }
            .tag(2)
        }
        .accentColor(.orange)
        .onTapGesture {
            print("selected tab: \(self.selectedItem)")
        }
    }
}

I'm receiving only 0 while switching tabs.
selected tab: 0.
selected tab: 0.

Elijah
  • 8,381
  • 2
  • 55
  • 49
Kiran Jasvanee
  • 6,362
  • 1
  • 36
  • 52

2 Answers2

10

I think you have the right idea, but don't use onTapGesture, instead use OnChange():

struct DefaultTabbar: View {

    @State private var selectedItem = 1

    var body: some View {
        TabView(selection: $selectedItem) {
            FirstView()
                .tabItem{
                    Image(systemName: "house")
                    Text("First Tab")
            }
            .tag(1)

            SecondView()
                .tabItem{
                    Image(systemName: "photo")
                    Text("Second Tab")
            }
            .tag(2)
        }
        .accentColor(.orange)
        .onChange(of: selectedItem) { value in print("selected tab = \(value)") }
    }
}
Elijah
  • 8,381
  • 2
  • 55
  • 49
Jack
  • 2,206
  • 3
  • 18
  • 25
1

You can use onAppear method for each tab. It's looks ugly but it's works.

struct DefaultTabbar: View {

    var lastSelectedTab = 0 {
        didSet {
            
        }
    }
    @State private var selectedItem = 1

    var body: some View {
        TabView(selection: $selectedItem) {
            FirstView()
                .onAppear(perform: {
                    lastSelectedTab = 0
                })
                .tabItem{
                    Image(systemName: "house")
                    Text("First Tab")
            }
            .tag(1)

            SecondView()
                .onAppear(perform: {
                    lastSelectedTab = 1
                })
                .tabItem{
                    Image(systemName: "photo")
                    Text("Second Tab")
            }
            .tag(2)
        }
        .accentColor(.orange)
    }
}