【问题标题】:How to disable back button in navigation bar如何禁用导航栏中的后退按钮
【发布时间】:2015-11-07 17:33:16
【问题描述】:

有什么官方方法可以设置UIBarButtonItem.enabled属性吗?我试图在以前的控制器中设置一个 backButtonItem。但是enabled 属性被忽略了。

在这个简单的example project 中了解更多信息。

我不想像“制作你自己的 leftBarButtonItem 并设置它的 alpha ...”这样的解决方案

编辑:我不想隐藏它,只能用暗色和禁用用户交互来禁用它。这与禁用 leftBarButtonItem 的行为完全相同。

【问题讨论】:

    标签: ios swift storyboard


    【解决方案1】:

    截至今天,无法使用enabled 属性禁用后退按钮。 backBarButtonItem 属性将是 nil 除非您创建自定义项,即使这样它也会忽略 enabled 属性。有几种(不令人满意的)方法可以解决这个问题。

    隐藏按钮

    鉴于他们忽略了 enabled 属性,这就是 Apple 希望您做的事情。就这么简单

    navigationItem.hidesBackButton = true  
    

    除非你有充分的理由,否则应该是首选方法。

    禁用和着色导航栏

    您可以在整个导航栏上禁用用户交互并对其进行着色以使后退按钮显示为禁用。

    navigationController?.navigationBar.isUserInteractionEnabled = false
    navigationController?.navigationBar.tintColor = UIColor.lightGray
    

    不幸的是,这确实会影响导航栏中的其他元素,因此如果您在右侧有另一个栏按钮项,则它可能不是一个选项。

    使用自定义左栏按钮项

    leftBarButtonItem 不会忽略enabled 属性,因此您可以创建自定义项并在激活时手动触发弹出。

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(ThisClass.backButtonTapped))
    ...
    navigationItem.leftBarButtonItem?.isEnabled = false
    
    func backButtonTapped() {
        self.navigationController?.popViewController(animated: true)
    }
    

    但是,这将没有带有前导三角形指示器的后栏按钮样式。

    【讨论】:

    • 我不想失去默认的后退手势和领先的三角形指示器。看来这是不可能实现的。谢谢你的长回答。
    • 导航栏 userInteractionEnabled = NO 在 iOS 10 上似乎对我不起作用?其他人有这个问题吗?
    • 我想在后退按钮的右侧添加一个按钮。当我使用 leftBarButtonItem 时,后退按钮会自动隐藏。使用导航控制器的后退按钮默认功能一次显示两个按钮的任何解决方案。
    • 我很困惑。你是说我可以禁用自定义栏按钮吗?我能够做到这一点,但是通过将其设置为禁用,我无法使其具有更浅的颜色。是否有内置功能?
    【解决方案2】:

    在您的 ViewController2.swift 类中添加以下代码。

    override func viewDidLoad() {
            super.viewDidLoad()
    
            navigationItem.hidesBackButton = true;
        }
    

    它会隐藏你的后退按钮。

    【讨论】:

    • 我已经尝试了所有可能的选项,但无法禁用后退按钮查看链接stackoverflow.com/questions/25362050/…,您必须创建自定义后退按钮。
    • 它隐藏和禁用。问题是如何禁用按钮。
    【解决方案3】:

    如果你想隐藏它,UInavigationItem 有一个hidesBackButton 属性。

    【讨论】:

      【解决方案4】:

      我知道这是一个旧线程,但这可能对其他人有所帮助。 正如hennes 所说,您不能再禁用后退按钮。相反,您需要禁用整个导航栏。

      我采用的方法是禁用导航栏,然后将 0.5 alpha 应用于导航栏的子视图。

      在您的 ViewController 类中:

          func changeBarButtons(alpha: CGFloat) {
              navigationController?.navigationBar.subviews.forEach { firstViews in
                  firstViews.subviews.forEach { view in
                      if ["_UIButtonBarButton", "_UIButtonBarStackView"].contains(type(of: view).description()) {
                          view.alpha = alpha
                      }
                  }
              }
          }
      
          func set(loading: Bool) {
              let alpha: CGFloat = loading ? 0.5 : 1
              navigationController?.navigationBar.isUserInteractionEnabled = !loading
      
              changeBarButtons(alpha: alpha)
          }
      

      请记住,Apple 可以随时更改课程名称。话虽如此,他们这样做的可能性很小。如果您不介意 View Controller 的标题淡出,您可以将 alpha 应用于所有子视图,而无需检查类名。

      【讨论】:

        【解决方案5】:

        不要尝试禁用您的自定义后退按钮(不起作用),只需设置一个禁用的新按钮即可。您可以通过UINavigationBar.backItem 属性访问上一个导航项。

        // set disabled back button
        let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: nil, action: nil)
        backButton.isEnabled = false
        navigationController?.navigationBar.backItem?.backBarButtonItem = backButton
        
        // disable pop gesture
        navigationController?.interactivePopGestureRecognizer?.isEnabled = false
        

        【讨论】:

          猜你喜欢
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-03
          • 1970-01-01
          • 1970-01-01
          • 2015-05-02
          相关资源
          最近更新 更多