【问题标题】:Way to get selected tab index from TabView in SwiftUI从 SwiftUI 中的 TabView 获取选定选项卡索引的方法
【发布时间】:2020-02-19 14:46:55
【问题描述】:

我刚刚添加了 TabView,它工作正常,但如果它,我无法获取选定的选项卡索引。
我想我的代码保持得很好,不知道出了什么问题。

struct DefaultTabbar: View {

    @State private var selectedItem = 1
    // @State private var homeTabIcon = "tab_home"

    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)")
        }
    }
}

我在切换标签时只收到 0。
所选标签:0.
所选标签:0。

【问题讨论】:

  • 改了,用在需要的地方。但是你不能在TabView上使用.onTapGesture

标签: ios swift swiftui


【解决方案1】:

您可以对每个选项卡使用 onAppear 方法。它看起来很丑,但它的工作原理。

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)
    }
}

【讨论】:

    【解决方案2】:

    尝试不使用 onTapGesture -> 它会停止正常的选项卡行为

    或者你需要 selectedindex 吗?

    【讨论】:

      【解决方案3】:

      我认为你的想法是对的,但不要使用 onTapGesture,而是使用 OnChange():

      struct DefaultTabbar: View {
      
          @State private var selectedItem = 1
          // @State private var homeTabIcon = "tab_home"
      
          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)")
          }
      }
      

      【讨论】: