在SwiftUI中从导航栏中删除后退按钮文本

时间:2020-03-04 14:07:34

标签: ios swift navigation swiftui

我最近开始在SwiftUI中工作,得出的结论是使用导航还不是很好。我正在尝试实现以下目标。我终于设法摆脱了半透明的背景,而没有导致应用程序崩溃,但是现在我遇到了下一个问题。如何摆脱navbaritem内部的“后退”文本?

enter image description here

我通过在SceneDelegate.swift文件中设置默认外观来实现上述观点。

let newNavAppearance = UINavigationBarAppearance()
newNavAppearance.configureWithTransparentBackground()
newNavAppearance.setBackIndicatorImage(UIImage(named: "backButton"), transitionMaskImage: UIImage(named: "backButton"))
newNavAppearance.titleTextAttributes = [
    .font: UIFont(name: GTWalsheim.bold.name, size: 18)!,
    .backgroundColor: UIColor.white

]

UINavigationBar.appearance().standardAppearance = newNavAppearance

实现此目标的一种可能方法是覆盖导航栏项目,但是此问题的创建者已经说过,它有一个缺点(SwiftUI Custom Back Button Text for NavigationView),在您覆盖导航之后,后退手势将停止工作酒吧项目。这样我也想知道如何设置后退按钮的前景色。现在它具有默认的蓝色,但是我想用另一种颜色覆盖。

5 个答案:

答案 0 :(得分:8)

其实很简单。以下解决方案是我做出的最快、最干净的解决方案。

例如,将其放在 SceneDelegate 的底部。

extension UINavigationController {
    // Remove back button text 
    open override func viewWillLayoutSubviews() {
        navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

这将从您应用中的每个 NavigationView (UINavigationController) 中删除后退按钮文本。

答案 1 :(得分:4)

我发现了一种直接使用SwiftUI删除后退按钮文本并保留原始人字形的简单方法。

import SwiftUI

struct ContentView: View {
  
  @Environment(\.presentationMode) var presentation
  
  var body: some View {
    VStack {
      // Your main view code here
    }
    .navigationBarBackButtonHidden(true)
    .navigationBarItems(leading: Button(action: { presentation.wrappedValue.dismiss() }) {
      Image(systemName: "chevron.left")
        .foregroundColor(.blue)
        .imageScale(.large)
    })
  }
}

答案 2 :(得分:4)

支持@Pitchbloas 提供的解决方案,此方法只涉及将 backButtonDisplayMode 属性设置为 .minimal

extension UINavigationController {

  open override func viewWillLayoutSubviews() {
    navigationBar.topItem?.backButtonDisplayMode = .minimal
  }

}

答案 3 :(得分:2)

因此,我实际上得到了以下切实可行的解决方案。我正在覆盖这样的导航栏项

.navigationBarItems(leading:
    Image("backButton")
        .foregroundColor(.blue)
        .onTapGesture {
            self.presentationMode.wrappedValue.dismiss()
    }
)

唯一的问题是后退手势无法正常工作,因此可以通过实际扩展UINavigationController

来解决。
extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

现在,它看起来完全符合我的要求,该解决方案有点笨拙……但它现在可以正常工作,希望SwiftUI会成熟一点,以便可以更轻松地实现。

答案 4 :(得分:1)

标准后退按钮标题取自上一屏幕的导航栏标题。

可以通过以下方法获得所需的效果:

demo

struct TestBackButtonTitle: View {
    @State private var hasTitle = true
    var body: some View {
        NavigationView {
            NavigationLink("Go", destination:
                Text("Details")
                    .onAppear {
                        self.hasTitle = false
                    }
                    .onDisappear {
                        self.hasTitle = true
                    }
            )
            .navigationBarTitle(self.hasTitle ? "Master" : "")
        }
    }
}