禁用长按返回按钮(标注菜单)

Cub*_*lax 1 navigation uinavigationbar ios swift ios14

iOS14 引入了长按后退按钮,它会打开一个标注菜单以返回到堆栈中的特定 VC。

我想禁用它,是否有可能做这样的事情,如果是,如何?

谢谢

see*_*eya 8

尝试在您的 VC 上设置backButtonDisplayMode.minimal->

if #available(iOS 14.0, *) {
    navigationItem.backButtonDisplayMode = .minimal
}
Run Code Online (Sandbox Code Playgroud)

https://developer.apple.com/documentation/uikit/uinavigationitem/3656350-backbuttondisplaymode

  • 为了详细说明@charleyatwork的答案,如果您最终得到一个空白菜单,因为您将“title”或“backButtonTitle”设置为空字符串以只有V形图标,则可以使用此代码段,但在“else”块中继续设置 `backButtonTitle = ""` 以获得两全其美的效果。 (4认同)
  • 我投了赞成票,但实际上不起作用 (3认同)
  • 是的,这在 iOS14 中工作得很好,取代了之前设置“backButtonTitle”的“黑客”。 (2认同)

ANT*_*RMA 5

它可以通过继承 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以按照你喜欢的方式在你的视图控制器中配置后退按钮,但使用 BackBarButtonItem 而不是 UIBarButtonItem:

let backButton = BackBarButtonItem(title: "BACK", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
Run Code Online (Sandbox Code Playgroud)

这是首选方式,因为您只在视图控制器的导航项中设置 backBarButtonItem 一次,然后无论它要推送什么视图控制器,推送的控制器都会在导航栏上自动显示后退按钮。如果使用 leftBarButtonItem 而不是 backBarButtonItem,则必须在将被推送的每个视图控制器上设置它。