Swiftui 当.statusbar(hidden:true)不工作或不响应时,在swift ui中隐藏状态栏

Swiftui 当.statusbar(hidden:true)不工作或不响应时,在swift ui中隐藏状态栏,swiftui,ios13,statusbar,Swiftui,Ios13,Statusbar,我有一个应用程序,它加载一个选项卡栏,其中视图作为初始屏幕RecipeList()。在RecipeList内部,我调用另一个视图以全屏显示配方。在RecipeList文件中,我有代码显示或隐藏状态栏,检查配方详细信息全屏视图是否已加载。如果我在xcode中预览它,效果会非常好,但是当我预览下面的代码时,这是我的Home()视图文件,并且由于tabbar的需要,我想加载作为初始屏幕的内容,那么RecipeList中显示或隐藏状态栏的代码就不再工作了,状态栏总是打开的 如果我试图在下面的代码中隐藏状

我有一个应用程序,它加载一个选项卡栏,其中视图作为初始屏幕RecipeList()。在RecipeList内部,我调用另一个视图以全屏显示配方。在RecipeList文件中,我有代码显示或隐藏状态栏,检查配方详细信息全屏视图是否已加载。如果我在xcode中预览它,效果会非常好,但是当我预览下面的代码时,这是我的Home()视图文件,并且由于tabbar的需要,我想加载作为初始屏幕的内容,那么RecipeList中显示或隐藏状态栏的代码就不再工作了,状态栏总是打开的

如果我试图在下面的代码中隐藏状态栏,它会工作,但总是关闭,这是我不想要的。只想在全屏显示时隐藏它

事实上,我使用Github的这个内省包在全屏加载子视图时隐藏了选项卡栏,我让它工作了

事实上,我想知道是否有人用内省来隐藏状态栏,比如tabbar。我试着使用它,但我是一个rockie,我只知道一点SwiftUI,没有Swift,没有视图控制器经验,什么都不知道

但我有一个功能齐全的应用程序,只有这个问题,我非常沮丧,因为我没有能力知道为什么tabbar视图强制使用持久状态栏

需要帮忙吗

var body: some View {

    ZStack {
                
        Color("background2")
            .edgesIgnoringSafeArea(.all)
                
        TabView {
        
            RecipeList().tabItem {
                    
                Image(systemName: "book.fill")
                    .font(.system(size: 24, weight: .bold))
                    
                Text("Galería")
                
            }

            PostList(section: sectionData[0]).tabItem {
                    
                Image(systemName: "list.bullet")
                    .font(.system(size: 22, weight: .bold))
                    
                Text("Listado")

            }
                
        }
        .accentColor(Color("accent"))
        .introspectTabBarController { tabBarController in

            // customize here the UITabBarViewController if you like
            self.viewModel.tabBarController = tabBarController
   
        }
                
    }
   
}

我建议您使用@EnvironmentObject包装器,它基本上允许您使用对象作为全局状态。您可以找到大量的教程来解释如何做到这一点,并将其插入初始视图中,以便在整个视图层次结构中可以访问此对象

设置全局状态后,可以有条件地隐藏状态栏,如下所示:

MyOutterWrapper {
    Text("Some text")
}
.statusBar(hidden: myGlobalState.statusBarHidden)
如果您使用的是NavigationView,请注意,如果将状态栏设置在那里,则隐藏状态栏效果最佳(同时假设navigation view是您出现的第一个视图)

现在,您所要做的就是在视图中,在进入全屏时将变量设置为true,在退出时将其设置为false。希望有帮助


编辑:忘了提到到2020年6月26日为止的隐藏状态栏只有在初始视图上设置时才起作用。您以后无法更改它,这就是我们设置此变量以便返回并动态更改值的原因。

我建议您使用@EnvironmentObject包装器,它基本上允许您将对象用作全局状态。您可以找到大量的教程来解释如何做到这一点,并将其插入初始视图中,以便在整个视图层次结构中可以访问此对象

设置全局状态后,可以有条件地隐藏状态栏,如下所示:

MyOutterWrapper {
    Text("Some text")
}
.statusBar(hidden: myGlobalState.statusBarHidden)
如果您使用的是NavigationView,请注意,如果将状态栏设置在那里,则隐藏状态栏效果最佳(同时假设navigation view是您出现的第一个视图)

现在,您所要做的就是在视图中,在进入全屏时将变量设置为true,在退出时将其设置为false。希望有帮助


编辑:忘了提到到2020年6月26日为止的隐藏状态栏只有在初始视图上设置时才起作用。您以后不能更改它,这就是我们设置此变量以便返回并动态更改值的原因。

我尝试了您的示例,并执行了以下操作:在my Home()主视图:@EnvironmentObject变量栏:HideTheBar和.statusBar(hidden:bar.hide)中类HideTheBar:ObserveObject{@Published var hide=false}在加载的视图中。onAppear{self.bar.hide=true}.onDisappear{self.bar.hide=false}状态栏做了我想做的事情,然后消失,但当这种情况发生时,整个界面就像刷新了一样,因此UI元素的所有位置都丢失了,它破坏了UI,因为它是一个加载了GeometryReader数据的视图,等等。它执行刷新,重置并中断所有内容:(@ikerortizderri是的,这是预期发生的。如果您使用GeometryReader,您应该预期某些内容将中断。是的,如果您有条件地更改UI上的某些内容,它将执行刷新:)但是当全屏childview在整个屏幕上都不刷新时,我用来隐藏选项卡栏的内省包,它就是这样做的,在没有fanfarre的情况下隐藏一个元素。你看到没有刷新的情况下隐藏状态栏的另一种方法了吗?我试过你的例子,我做到了:在my Home()主视图:@EnvironmentObject var bar:HideTheBar和.statusbar(hidden:bar.hide)中,在加载的视图中,类HideTheBar:ObserveObject{@Published var hide=false}。onDisappear{self.bar.hide=false}状态栏做了我想做的事情,然后消失,但当这种情况发生时,整个界面就像刷新了一样,因此UI元素的所有位置都丢失了,它会破坏UI,因为它是一个加载了GeometryReader数据的视图,等等。它会进行刷新,重置并破坏所有:(@ikerortizderri是的,这是有意的。如果您正在使用GeometryReader,您应该预期某些内容会中断。是的,如果您有条件地更改UI上的某些内容,它会刷新:)但是,当全屏childview在整个屏幕上都不刷新时,我用来隐藏选项卡栏的内省包,它就是这样做的,在没有fanfarre的情况下隐藏一个元素。你看到没有刷新的情况下隐藏状态栏的另一种方法了吗?你能提供一个关于如何使其工作的示例项目吗?你能提供一个关于如何工作的示例项目吗它能工作吗!?