导航栏:“隐藏”标题,但为后续的后退按钮保留它

Posted

技术标签:

【中文标题】导航栏:“隐藏”标题,但为后续的后退按钮保留它【英文标题】:Navigation bar: "hide" title but keep it for the subsequent back button 【发布时间】:2021-05-10 11:29:27 【问题描述】:

在我的应用中,我有两个 SwiftUI 视图,我们称它们为 View1 和 View2。 View1 以 UIHostingController 的形式启动,并有一个“转到 View2”按钮,该按钮将 View2 推到提到的 UIHostingController 的导航控制器上(没有 SwiftUI 导航链接等)。 View1 必须显示导航栏,因为它在工具栏中有一个自定义的“退出”按钮。 View2 应该显示通向 View1 的“

问题:

如果我将 UIHostingController 的导航栏标题设置为“”,那么 不会有“

如果我将 UIHostingController 的导航栏标题设置为 “Back”,那么回来后View1会在“Back”中显示“Back” 导航栏的中间。

如果我一开始隐藏导航栏,那么“退出”按钮将不会出现 显示。

所以,总而言之,我需要的是: View1 仅显示带有“退出”工具栏按钮的导航栏,没有标题。 View2 仅显示“

我怎样才能实现它?

注意:整个导航逻辑是用 UIKit 完成的。 View1 通知视图模型,该视图模型调用将 View2 推送到导航堆栈的委托。没有 SwiftUI 导航链接等。

【问题讨论】:

【参考方案1】:

您可能需要考虑一个隐藏的导航链接,以便获得您正在寻找的推送行为。这将为您留下以下观点;

struct View1: View 
    @State private var isActive = false

    var body: some View 
        NavigationView 
            VStack 
                Button("Present") 
                    isActive = true
                

                NavigationLink(destination: View2(), isActive: $isActive) 
                    EmptyView()
                .hidden()
            .toolbar(content: 
                Button("Exit") 
                    print("Exit view")
                
            )
        
    

struct View2: View 
    var body: some View 
        NavigationView 
            Text("View 2")
        
    

您的第一个视图将使用按钮通过推送动画呈现视图 2。为您提供您正在寻找的后退按钮行为。您的第一个视图将在右上角的工具栏中没有标题和退出按钮。

【讨论】:

不幸的是,包括工具栏按钮在内的整个导航逻辑都是通过 UIHostingController 完成的,并且必须保留。 swift UI 中不允许使用导航链接,因为这会与已经存在的导航控制器混淆,这可能会导致奇怪的问题。 好的,所以你基本上想从 swiftUI 中操作 UIKit 导航栏。但我不确定这种方法在这里是否正确。您将不得不做很多自定义工作来保持默认的 ios 行为。我会将退出按钮和它的逻辑添加到您的 SwiftUI 视图中。然后您可以将view1 呈现为UIHostedViewController 并在SwiftUI 中保留默认导航栏行为。如果这不可能,您能否提供一个复制问题的小示例?

以上是关于导航栏:“隐藏”标题,但为后续的后退按钮保留它的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 hidesBackButton 隐藏导航栏中的后退按钮

在导航控制器中添加标签栏控制器时隐藏后退按钮

如何隐藏导航栏后退按钮

导航栏隐藏标题和后退按钮 iOS 7

更改后退导航栏按钮的字体

导航栏中的 Swift 自定义后退按钮