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

原文 标签 ios swift uikit ios14

在iOS 14+中,点击并按住UINavigationItem的backBarButtonItem将显示完整的导航堆栈。然后,用户可以弹出到堆栈中的任意点,而以前,用户唯一可以做的就是点击该项目以弹出堆栈中的一个项目。
是否可以禁用此功能? UIBarButtonItem具有一个名为menu的新属性,但是尽管按住该按钮时未显示菜单,但它似乎为nil。这使我相信这可能是无法更改的特殊行为,但也许我忽略了某些事情。

最佳答案

可以通过子类化UIBarButtonItem来完成。在UIBarButtonItem上将菜单设置为nil无效,但是您可以覆盖menu属性并防止首先设置它。

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应用程序的开源文件管理器UI?

ios - 如何创建一个自定义UIView,它根据Objective-C中的滚动方向从UINavBar的后面向下或向上滑动?

ios - SKCameraNode跟不上移动的节点

ios - UIButton正常工作,但在popoverPresentationController中不起作用

ios - 根据限定符将变量设置为不同的自定义 View (快速)

ios - UICollectionView scrollToItem()滚动到上一个单元格无法正常工作

iphone - 在nsdocumentdirectory中添加uiimage并检索

ios - 应用程序失败的代码签名验证(无权利)

ios - cellForItemAt没有在collectionView中调用

ios - 锁定屏幕后,iPad应用程序变得不 Activity