ios - 是否可以在 iOS 14+ 中禁用后退导航菜单?

标签 ios swift uikit ios14

在 iOS 14+ 中,点击并按住 backBarButtonItem UINavigationItem 将呈现完整的导航堆栈。然后用户可以弹出到堆栈中的任何点,而以前用户所能做的只是点击该项目以弹出堆栈中的一个项目。
是否可以禁用此功能? UIBarButtonItem 有一个名为 menu 的新属性,但尽管按住按钮时显示菜单,但它似乎为零。这让我相信这可能是无法改变的特殊行为,但也许我忽略了一些东西。

最佳答案

它可以通过继承 UIBarButtonItem 来完成。在 UIBarButtonItem 上将菜单设置为 nil 不起作用,但您可以覆盖菜单属性并防止首先对其进行设置。

class BackBarButtonItem: UIBarButtonItem {
    @available(iOS 14.0, *)
    override var menu: UIMenu? {
        set {
            // Don't set the menu here
            // super.menu = menu
        }
        get {
            return super.menu
        }
    }
}
然后,您可以按照自己喜欢的方式在 View Controller 中配置后退按钮,但使用 BackBarButtonItem 而不是 UIBarButtonItem。
let backButton = BackBarButtonItem(title: "BACK", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
这是首选,因为您只在 View Controller 的导航项中设置了一次 backBarButtonItem,然后无论将要推送的 View Controller ,推送的 Controller 都会在导航栏上自动显示后退按钮。如果使用 leftBarButtonItem 而不是 backBarButtonItem,则必须在每个将被推送的 View Controller 上设置它。
编辑:
长按时出现的后退导航菜单是 UIBarButtonItem 的一个属性。可以通过设置 navigationItem.backBarButtonItem 属性来自定义 View Controller 的后退按钮,这样我们就可以控制菜单。我看到的这种方法的唯一问题是丢失了系统按钮具有的“返回”字符串的本地化(翻译)。
如果您希望禁用菜单成为默认行为,您可以在一个地方实现这一点,在符合 UINavigationControllerDelegate 的 UINavigationController 子类中:
class NavigationController: UINavigationController, UINavigationControllerDelegate {
  init() {
    super.init(rootViewController: ViewController())
    delegate = self
  }
   
  func navigationController(_ navigationController: UINavigationController,
                            willShow viewController: UIViewController, animated: Bool) {
    let backButton = BackBarButtonItem(title: "Back", style: .plain, target: nil, action: nil)
    viewController.navigationItem.backBarButtonItem = backButton
  }
}

关于ios - 是否可以在 iOS 14+ 中禁用后退导航菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62883560/

相关文章:

ios - 如何为 UITableView 部分创建自定义背景?

ios - 如何使用 MKLocalSearch 请求获取附近的地点、照片

ios - UISplitViewController - 状态栏颜色,iOS 7

ios - 如何在 Swift 中的 "model"组件中设置委托(delegate) View Controller 类

ios - 如何在swift中发出http请求? (错误: on json)

ios - 为什么 UICollectionView 在 Xcode 11 (ios 13) 中省略 Line/Intrim 间距?

ios - 释放触摸时 UISlider 过于敏感

ios - 如何忽略触摸事件并将它们传递给另一个 subview 的 UIControl 对象?

objective-c - Xcode 4.1 同时关闭两个 ModalViewController

iOS - UISearchBar 动态搜索结果在快速输入时不起作用(快速)