SwiftUI - 为什么在 macOS 上更改选项卡时 TabView 及其内容有时不刷新?

SwiftUI - Why is TabView and its contents sometimes not refreshing when I change tabs on macOS?

我正在尝试使用 SwiftUI 在 macOS 上制作选项卡式应用程序,但我遇到了 TabView.

的奇怪问题

当我有两个带有 TextField 的选项卡并将它们的文本状态保存到它们各自的私有变量时,会发生一些奇怪的事情:当我从 tab A 切换到tab Btab ATextField 中输入文本后,标签指示器显示我仍在 选项卡 A,但内容显示 选项卡 B 的内容。当我再次点击tab B的按钮时,它仍然会显示tab B的内容。此外,当我之后按下 tab A 的按钮时,它将显示 tab A 的内容,但该选项卡的指示器仍然显示我在 选项卡 B

我可能做错了什么?

这里有一个例子可以说明我的问题:

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView
            {
                TabAView()
                    .tabItem({Text("Tab A")})
                TabBView()
                    .tabItem({Text("Tab B")})
        }
    }
}

struct TabAView: View {
    @State private var text = ""
    var body: some View {
        VStack{
            Text("Tab A")
            TextField("Enter", text: $text)
        }
    }
}

struct TabBView : View {
    @State private var text = ""
    var body: some View {
        VStack {
            Text("Tab B")
            TextField("Enter", text: $text)
        }
    }
}

这是发生的问题的屏幕截图:

这绝对是SwiftUI实现TabView的一个bug。但是您可以通过绑定到 TabView 选择并像这样手动设置当前选项卡来轻松解决此问题:

struct ContentView: View {
    @State private var currentTab = 0
    var body: some View {
        TabView(selection: $currentTab)
            {
                TabAView()
                    .tabItem({Text("Tab A")})
                    .tag(0)
                    .onAppear() {
                        self.currentTab = 0
                    }
                TabBView()
                    .tabItem({Text("Tab B")})
                    .tag(1)
                    .onAppear() {
                        self.currentTab = 1
                    }
        }
    }
}

此错误似乎仅在用户在 TextField 具有焦点的情况下更改选项卡时才会出现。

如果您对代码进行上述更改,它将按预期工作。