Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TabView (SwiftUI): Respond onTab on an already active tabItem

Tags:

ios

swift

swiftui

I have a ContentView.swift which contains a TabView.

View1 has a NavigationView in it with some childViews. View2 is just a single View.

I would like to perform some action (always return to View1, even when being in a childView of View1), when the first tabItem is pressed. Even if it is already the active tabItem.

I tried onTapGesture as seen below, which didn't seem to do anything. Adding it right before ".tag(0)" didn't change anything, either:

TabView {
    View1()
        .onTapGesture {
            print("Test")
        }
        .tabItem {
            Image(systemName: "doc.plaintext")
                .font(.system(size: 25))
            Text("View1")
        }.tag(0)

    View2()
        .tabItem {
            Image(systemName: "person.crop.circle")
                .font(.system(size: 25))
            Text("View2")
        }.tag(1)
}
like image 899
Kuhlemann Avatar asked Mar 02 '23 14:03

Kuhlemann


1 Answers

Here is possible approach. Tested with Xcode 11.4 / iOS 13.4

struct TestTabSelectionAction: View {
    @State private var selectedTab = 0

    var body: some View {
        let selection = Binding<Int>(
            get: { self.selectedTab },
            set: { self.selectedTab = $0
                print("Pressed tab: \($0)")
                if $0 == 0 {
                           // <<< your action here !!
                }
        })

        return TabView(selection: selection) {
            View1()
            .tabItem {
                Image(systemName: "doc.plaintext")
                    .font(.system(size: 25))
                Text("View1")
            }.tag(0)

            View2()
                .tabItem {
                    Image(systemName: "person.crop.circle")
                        .font(.system(size: 25))
                    Text("View2")
            }.tag(1)
        }
    }
}
like image 85
Asperi Avatar answered Mar 05 '23 16:03

Asperi