swiftui - TabView 在模态显示时不遵守选择绑定(bind)

标签 swiftui tabview xcode12

考虑到下面的代码,我希望我的 TabView 在显示我的选项卡 View 时显示随机计算的图像,但事实并非如此。它将始终在索引 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))
    }
}

最佳答案

原因不在于模态(即在工作表中显示),而在于 TabView不读取初始(!)选择(这绝对是一个 SwiftUI 错误)
这是解决方法(在复制代码上使用 Xcode12/iOS 14 进行测试)
demo

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

关于swiftui - TabView 在模态显示时不遵守选择绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62714545/

相关文章:

swift - 为什么我的 SwiftUI 列表再次追加所有对象而不是更新现有对象?

ios - SwiftUI 文本在设置为抵抗时被截断?

android - 从一个 fragment 调用另一个 fragment

validation - primefaces tabView 在选项卡更改时跳过表单验证

Xcode 显示 "The document had 4 issues that were found and repaired./Multiple resources have the same name: groupTableViewBackgroundColor."警报

swift - 带有 SwiftUI 的 macOS 应用程序中不稳定的导航 View

ios - 使用 SwiftUI 自动计算填充以填充整个 View 的框架

安卓 : How to create TabLayout with drawable for count textview?

objective-c - undefined symbol : _OBJC_CLASS_$_FIRApp

ios - MetricKit MX诊断符号