【问题标题】:SwiftUI - Navigation bar back button appears for a fraction of secondSwiftUI - 导航栏后退按钮出现几分之一秒
【发布时间】:2022-12-21 07:25:48
【问题描述】:

我研究了很多解决方案,但没有一个有效。我的应用程序导航流程是

  1. ViewController (UIKit) - 推送到 SwiftUI 视图
  2. 此 SwiftUI 视图显示后退栏按钮几分之一秒,然后被隐藏。

    这是我的代码:

    struct FirstSwiftUIView: View {
    
    var body: some View {
    
      VStack {
        Text("First SwiftUi View")
        NavigationLink {
          SecondSwiftUIView()
        } label: {
          Text("Next View")
        }
      }
      .navigationBarBackButtonHidden(true)
      .navigationBarTitle("")
    }
    

    }

【问题讨论】:

    标签: ios swiftui swiftui-navigationview


    【解决方案1】:

    我找到了修复,在从 UIKit 转到 SwiftUI 之前,可以从 UIHostingController 隐藏后退按钮。

    let firstSwiftUI = UIHostingController(rootView: FirstSwiftUIView())
    firstSwiftUI.navigationItem.hidesBackButton = true
    navigationController?.pushViewController(firstSwiftUI, animated: true)
    

    【讨论】:

      【解决方案2】:
      • 将视图包装在 NavigationView 中。 (也许你在 App 结构中这样做了)

      • 在目标视图中使用.navigationBarBackButtonHidden(true)——因为你想在那里隐藏后退按钮。

        结构内容视图:查看{

          var body: some View {
        
              NavigationView {
                  VStack {
                      Text("First SwiftUi View")
                      NavigationLink {
        
                          // your destination view
                          Text("Destination")
                              .navigationBarBackButtonHidden(true)
        
                      } label: {
                          Text("Next View")
                      }
                  }
                  .navigationBarTitle("")
              }
          }
        

        }

      【讨论】:

      • 我进入 FirstSwiftUIView 的视图位于 UIKit(一个 ViewController)中,它已经有一个 UINavigationController。所以在 SwiftUI 中再次添加 NavigationView 会在顶部创建两个导航栏。
      • 然后删除我额外的NavigationView——重要的一点是,.navigationBarBackButtonHidden(true)在内部视图上。
      • 实际上,如果第一个和第二个视图是 SwiftUI,这很好用。但是当我从 UIKit 导航到 SwiftUI 时不是这样。
      【解决方案3】:

      你可以使用这个技巧:

      final class CommonHostingController<Content: View>: UIHostingController<Content> {
          override func viewWillAppear(_ animated: Bool) {
              super.viewWillAppear(animated)
              navigationController?.setNavigationBarHidden(true, animated: false)
              navigationController?.setNavigationBarHidden(false, animated: animated)
          }
      }
      

      您的 SwiftUI 视图的导航栏将立即显示,但您的 UIKit viewController 的导航栏将在推送动画期间隐藏。

      看起来更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 2021-09-08
        • 1970-01-01
        • 2023-03-16
        • 2014-01-16
        相关资源
        最近更新 更多