有没有办法覆盖导航视图工具栏中的默认后退按钮,而不需要向每个辅助视图添加修饰符?

问题描述 投票:0回答:2

我知道在视图上您可以添加以下修饰符来修改导航栏以创建自定义后退按钮。

    SomeView{ ... }
    .navigationBarBackButtonHidden(true)
    .toolbar {
        ToolbarItem(placement: .navigationBarLeading) {
            Button {
                mode.wrappedValue.dismiss()
            } label: {
                Image(systemName: "chevron.backward")
            }
        }

但是,我不想遍历整个应用程序到每个辅助视图并添加这些修改器。我考虑过创建一个可重用的标头组件,但目前,我只是想知道是否有一种方法可以覆盖后退按钮的系统默认值以影响整个应用程序。

swiftui
2个回答
0
投票

目前还无法在

SwiftUI
中做到这一点。但是,您可以覆盖
UINavigationController
,但不建议这样做,因为
API
肯定会不时发生变化。

List
为例,我们曾经通过操纵
UITableView
的外观来全局改变
List
的背景颜色。从 iOS 16 开始,此解决方案不再有效。

扩展

View
并创建自定义修改器是您能做的最好的事情。


0
投票

这个 UIKit 覆盖在 iOS 16 中对我有用(尽管后退按钮文本可能未对齐):

@main
struct TestApp: SwiftUI.App {
    
    init() {
        // Back button
        let navBarAppearance = UINavigationBar.appearance()
        if let image = UIImage(named: "arrow.back") {
            navBarAppearance.backIndicatorImage = image
            navBarAppearance.backIndicatorTransitionMaskImage = image
        }
    }
...
}

本机滑动模式也适用于 App 文件中的此覆盖(可在另一篇 StackOverflow 文章中找到):

/// Prevents custom back button dismiss actions from preventing native swiping interactions (i.e. swipe to go back)
    extension UINavigationController: UIGestureRecognizerDelegate {
        override open func viewDidLoad() {
            super.viewDidLoad()
            interactivePopGestureRecognizer?.delegate = self
        }
    
        public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
            return viewControllers.count > 1
        }
    
        // To make it works also with ScrollView
        public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            true
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.