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)
}
}
}
更新:
感谢 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)
}
}
}