【问题标题】:TabView does not respect selection binding when displayed modallyTabView 在模态显示时不尊重选择绑定
【发布时间】:2020-10-24 03:03:07
【问题描述】:

考虑到下面的代码,我希望我的 TabView 在显示我的选项卡视图时显示随机计算的图像,但事实并非如此。它将始终在索引 0 处显示第一张图像。如果我在 TabView 初始化程序(即.constant(n))中对选择进行硬编码,那么它将正确显示所选图像。我已为此提交了一份雷达 (FB7844985),但想检查一下我是否遗漏了一些明显的东西?

struct ContentView: View {
    let assets: [String] = (1...32).map { "preview_\($0)"}
    
    @State private var selection: Int = 0
    @State private var isPresented: Bool = false
    var body: some View {
        VStack {
            Button("Random element") {
                selection = Int.random(in: 1...32)
                isPresented = true
            }
        }
        .sheet(isPresented: $isPresented) {
            SlideshowView(selection: $selection, assets: assets)
        }
    }
}

struct SlideshowView: View {
    @Binding var selection: Int
    var assets: [String]
    var body: some View {
        TabView(selection: $selection) {
            ForEach(assets.indices, id: \.self) { index in
                Image(assets[index])
                    .resizable()
                    .aspectRatio(contentMode: .fit)
            }
        }
        .tabViewStyle(PageTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
    }
}

【问题讨论】:

    标签: swiftui tabview xcode12


    【解决方案1】:

    原因不在于模态(即显示在工作表中),而是TabView 没有读取初始(!)选择(这绝对是一个 SwiftUI 错误)

    这是解决方法(在复制代码上使用 Xcode12 / iOS 14 测试)

    struct SlideshowView: View {
        @Binding var selection: Int
        var assets: [String]
        var body: some View {
            TabView(selection: $selection) {
                ForEach(assets.indices, id: \.self) { index in
                    Image(assets[index])
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                }
            }
            .tabViewStyle(PageTabViewStyle())
            .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
            .onAppear {
                // WORKAROUND: simulate change of selection on appear !!
                let value = selection
                selection = -1
                DispatchQueue.main.async {
                    selection = value
                }
            }
        }
    }
    

    【讨论】:

    • 太棒了。谢谢你。它按你说的那样工作。我会接受这个作为答案并在修复后再次发表评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2021-05-18
    • 2020-11-05
    • 2015-09-05
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多