如何在TabView上触发工作表单击

时间:2019-10-17 08:33:04

标签: swift swiftui

当我单击TabView中的选项卡时如何显示工作表?互联网上的所有示例都使用一个Button来触发更新,但是我想让该表在用户单击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。我不想用SheetView替换HomeView,因为我希望它是一个工作表而不是静态视图。谢谢!

1 个答案:

答案 0 :(得分:0)

这可以通过将State变量上移并控制Group内的流来实现,尽管相当骇人。在这里,为了简单起见,我只是将它们移至应用程序状态。

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)


                }
            }

        }

    }
 }