TabView 选择重置为 sheet 演示文稿中的第一个选项卡

TabView selection resets to first tab on sheet presentation

更新:

感谢 Harshil & Sumit 指出我太笨了,没有意识到我使用的是 id() 而不是 tag()。如果说你能从这个问题中学到什么,那就是:

当你独自完成一个项目时,你往往会失明。你看不到自己的错误。进行代码审查。请朋友和同事过目。这是个好主意。 ;)

原问题:

在我的 SwiftUI 项目中,我使用 TabView$selection 绑定,以便能够以编程方式切换选项卡。

问题是:例如,当我在 TabView 中包含的第二个视图上显示 sheet 时,选择被重置为第一个标签。

对我来说,这似乎是一个 SwiftUI 错误 - 但是否有 解决方法

您可以在下面找到一个演示该行为的工作示例。 (使用 Xcode 12.4 测试)

如何测试: 转到第二个选项卡,点击“Two”按钮,您将看到您回到第一个选项卡。一旦从 TabView 中删除 selection 属性,这种情况就不会再发生了。

干杯 奥兰多

enum TabPosition: Hashable {
    case one
    case two
    case three
}

struct RootView: View {
    
    @State private var selection: TabPosition = .one
    
    var body: some View {
        TabView(selection: $selection) {
            One()
                .tabItem { Label("One", systemImage: "1.circle") }
                .id(TabPosition.one)
            Two()
                .tabItem { Label("Two", systemImage: "2.circle") }
                .id(TabPosition.two)
            Three()
                .tabItem { Label("Three", systemImage: "3.circle") }
                .id(TabPosition.three)
        }
    }
}


struct One: View {
    var body: some View {
        Text("One").padding()
    }
}

struct Two: View {
    
    @State var isPresented = false
    
    var body: some View {
        Button("Two") { isPresented.toggle() }
        .sheet(isPresented: $isPresented, content: {
            Three()
        })
    }
}

struct Three: View {
    var body: some View {
        Text("Three").padding()
    }
}

而不是 id .od(TabPosition.one) 像这样分配标签 .tag(TabPosition.one)

像这样使用.tag()

struct ContentView: View {
    @State private var selection = 1
    var body: some View {
        TabView(selection: $selection) {
            One()
                .tabItem { Label("One", systemImage: "1.circle") }
                .tag(1)
            Two()
                .tabItem { Label("Two", systemImage: "2.circle") }
                .tag(2)
            Three()
                .tabItem { Label("Three", systemImage: "3.circle") }
                .tag(3)
        }
    }
}