Swift 如何在选项卡视图上触发工作表单击

Swift 如何在选项卡视图上触发工作表单击,swift,swiftui,Swift,Swiftui,在TabView中单击选项卡时如何显示工作表?internet上的所有示例都使用一个按钮来触发更新,但我希望在用户单击TabView中的一个选项卡时显示工作表 我尝试通过添加.onAppear()在选项卡式视图中更改布尔状态变量,但似乎不起作用 struct ContentView: View { @State var showSheet: Bool = false var body: some View { return TabView {

在TabView中单击选项卡时如何显示工作表?internet上的所有示例都使用一个按钮来触发更新,但我希望在用户单击TabView中的一个选项卡时显示工作表

我尝试通过添加.onAppear()在选项卡式视图中更改布尔状态变量,但似乎不起作用

struct ContentView: View {
    @State var showSheet: Bool = false

    var body: some View {
        return TabView {
            HomeView()
                .tabItem {
                    Image(systemName: "house")
                }
        }
        .sheet(isPresented: self.$showSheet) {
            SheetView(isShown: self.$showSheet)
        }
    }
}

在上面的示例中,我基本上希望单击选项卡时显示SheetView。我不想将HomeView替换为SheetView,因为我希望它是一个图纸而不是静态视图。谢谢

这可以通过将状态变量向上移动一个级别并控制
组中的流来实现,尽管这有点老套。在这里,为了简单起见,我将它们移动到应用程序状态

final class AppState: ObservableObject {
    @Published var shouldShowActionSheet: Bool = true
    @Published var selectedContentViewTab: ContentViewTabs = .none
}
SceneDelegate.swift
中:

 . . . 
 window.rootViewController = UIHostingController(rootView: contentView.environmentObject(AppState()))
 . . .
最后,在你看来:

public enum ContentViewTabs: Hashable {
    case none 
    case home
}

struct ContentView: View {

    @EnvironmentObject var appState: AppState

    var body: some View {

        Group {

            if (appState.selectedContentViewTab == .home && self.appState.shouldShowActionSheet) {
                Text("").sheet(isPresented: self.$appState.shouldShowActionSheet, onDismiss: {
                    self.appState.shouldShowActionSheet.toggle()
                    self.appState.selectedContentViewTab = .none
                }, content: {
                    Text("Oll Korrect, Chaps!")
                })
            } else {

                TabView(selection: self.$appState.selectedContentViewTab) {
                    Text("First View")
                        .font(.title)
                        .tabItem {
                            VStack {
                                Image("first")
                                Text("First")
                            }
                    }.tag(ContentViewTabs.home)


                }
            }

        }

    }
 }