xcode . on视图在TabView中可见之前显示打印

r9f1avp5  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(141)

我正在使用TabView制作入职屏幕。
我在此举几个例子。
我有这样的代码tabview:

TabView(selection: $pageIndex) {
                ForEach(0..<3) { item in
                  Text("Test")
                    .onAppear {
                     print(item)
                   }
              }
            }    
                .animation(.easeInOut, value: pageIndex)
                .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
                .indexViewStyle(.page(backgroundDisplayMode: .interactive))

当应用程序运行时,控制台打印输出0,但当幻灯片显示在下一个视图时,显示1和2。
出了什么问题?

lstz6jyr

lstz6jyr1#

PageTabViewStyle是使用滚动视图实现的,它会将页面预加载到滚动视图中以获得平滑的滚动体验,这就是为什么当您只滚动到第1页时,第2页会“出现”的原因:它希望在用户继续滚动经过页面1的情况下准备好。
使用onChange而不是onAppear监视pageIndex中的更改:

struct DemoView: View {
    @State var pageIndex = 0

    var body: some View {
        TabView(selection: $pageIndex) {
            ForEach(0..<3) { item in
                Text("page \(item)")
            }
        }
        .animation(.easeInOut, value: pageIndex)
        .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
        .indexViewStyle(.page(backgroundDisplayMode: .interactive))
        .onChange(of: pageIndex) { newValue in
            print("page \(newValue)")
        }
    }
}

请注意,onChange不会在页面0的初始外观中触发。如果需要,可以在选项卡视图中添加onAppear

struct DemoView: View {
    @State var pageIndex = 0

    var body: some View {
        TabView(selection: $pageIndex) {
            ForEach(0..<3) { item in
                Text("page \(item)")
            }
        }
        .animation(.easeInOut, value: pageIndex)
        .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
        .indexViewStyle(.page(backgroundDisplayMode: .interactive))
        .onChange(of: pageIndex) { newValue in
            print("page \(newValue)")
        }
        .onAppear {
            print("page \(pageIndex)")
        }
    }
}

相关问题