SwiftUI TabView 更新选择不更新所选选项卡

ska*_*ake 8 ios swiftui swiftui-tabview

由于某种原因,在这个非常简单的示例中,更新选择不会更新所选选项卡。我的期望是它最初会显示选项卡 1,当我按下“切换选项卡”按钮时,它应该滑到选项卡 0。相反,我必须切换选项卡 3 次才能最终滑到选项卡 0。

在 iOS 16 中测试

struct Test: View {
    @State var currentTab = 1
    var body: some View {
        VStack {
            Text("Current Tab: \(currentTab)")
            TabView(selection: $currentTab) {
                Text("Tab 0")
                    .tag(0)
                Text("Tab 1")
                    .tag(1)
            }
            .tabViewStyle(.page(indexDisplayMode: .never))
            Button {
                withAnimation(Animation.easeIn(duration: 0.2)) {
                    if currentTab == 0 {
                        currentTab = 1
                    } else {
                        currentTab = 0
                    }
                }
            } label: {
                Text("Toggle Tab")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

iOS 16.1 模拟器中的问题示例:

Ale*_*ges 11

好家伙。当 TabView 的初始选择是第二个可用标签并且您对选择值的第一次编程更改是转到第一个标签时,似乎存在错误。我这样说是因为我已经尝试过使用 0 到 30 的 Int 范围,并且只有在尝试 1) 从初始选择 1 开始,然后 2) 递减到 0。递增到 3 时才能具体重现。从 0 开始并递增。我觉得我错过了一些奇怪的东西,但这也可能只是一个错误。我不会感到震惊,因为 TabView 在显示为 PageTabView 时的行为是如此不同,并且您不会看到大量不从第一页开始的类似 PageTabView 的 UI 元素的使用。

无论如何。尽管它很脏,但我目前拥有的唯一可靠的修复方法是简单地以编程方式在 .onAppear 中向下和向上切换。我可以想到其他可能的解决方法的想法,但目前我觉得发布此内容比让您没有任何反馈要好。

请注意,.onAppear 在子组周围的组中的放置至关重要。将其放置在最初显示的子项上,它将干扰以后的使用,因为当用户返回到最初显示的子项时会调用 .onAppear。将其放在 TabView 上,似乎调用得太早,无法产生所需的 hacky 效果。

struct Test: View {
    @State var currentTab = 1
    var body: some View {
        VStack {
            Text("Current Tab: \(currentTab)")
            TabView(selection: $currentTab) {
                Group {
                    Text("Tab 0")
                        .tag(0)
                    Text("Tab 1")
                        .tag(1)
                }
                .onAppear {
                    currentTab = 0
                    currentTab = 1
                }
            }

            .tabViewStyle(.page(indexDisplayMode: .never))

            Button {
                withAnimation(Animation.easeIn(duration: 0.2)) {
                    if currentTab == 0 {
                        currentTab = 1
                    } else {
                        currentTab = 0
                    }
                }
            } label: {
                Text("Toggle Tab")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 让我烦恼的是,我们正在构建基于黑客的应用程序,并解决苹果旗舰 UI 工具中 3 年多的基本功能中的错误。 (3认同)