@State var更改时,带有“ PageTabViewStyle”的TabView不会更新其内容

时间:2020-08-20 06:49:18

标签: swiftui tabview

我在SwiftUI中遇到了一个奇怪的问题。 我创建了一个仅包含一个按钮的简单视图 和使用PageViewStyle的TabView。看来TabView不会更新其内容 是否正确取决于变量的状态。 内容似乎已经以某种方式进行了更新,但是View却无法按照我的期望进行更新

这是我的看法代码:

struct ContentView: View {
    @State var numberOfPages: Int = 0
    @State var selectedIndex = 0
    
    var body: some View {
        VStack {
            Text("Tap Me").onTapGesture(count: 1, perform: {
                self.numberOfPages = [2,5,10,15].randomElement()!
                self.selectedIndex = 0
            })
            
            TabView(selection: $selectedIndex){
                ForEach(0..<numberOfPages, id: \.self) { index in
                    Text("\(index)").background(Color.red)
                }
            }
            .frame(height: 300)
            .tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
        }.background(Color.blue)
    }
}

这是几次点击标签后结果的样子。 初始状态不是0页。点击后,我希望 TabView发生更改,因此所有页面都将可滚动且可见,但是出于某种原因,只有页面指示器会更新它的状态。

enter image description here

1 个答案:

答案 0 :(得分:7)

TabView希望具有页面容器,但是您只包含了一个HStack(具有自己的动态内容),而且您必须重置选项卡视图来链接页面数,因此,这里有一个解决方法。

通过Xcode 12 / iOS 14测试

demo

struct ContentView: View {
    @State var numberOfPages: Int = 0

    var body: some View {
        VStack {
            Text("Tap Me").onTapGesture(count: 1, perform: {
                self.numberOfPages = [2,5,10,15].randomElement()!
            })
            if self.numberOfPages != 0 {
                TabView {
                    ForEach(0..<numberOfPages, id: \.self) { index in
                        Text("\(index)").frame(width: 300).background(Color.red)
                    }
                }
                .tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
                .frame(height: 300)
                .id(numberOfPages)
            }
        }
    }
}