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 14+中禁用后退导航菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62883560/

相关文章:

json - 解析JSON Swift 3字典

ios - 使用核心图形绘制时如何跳过区域(切口)

ios - UIDocumentInteractionController可以预览哪些文件类型?

cocoa-touch - iPad groupTableViewBackground颜色坏了吗?

ios - 如何设置静态分组的TableView单元格的宽度

ios - 将二进制字符串附加到NSMutableData

ios - scrollView的ContentInset

ios - 键盘Y位置错误

ios - 如何使用谓词从NSArray中选择另一个NSArray中包含的对象

ios - 栏中的ios后退按钮