【问题标题】:how to disable a navigation bar button item in iOS如何在 iOS 中禁用导航栏按钮项
【发布时间】:2014-10-11 07:01:03
【问题描述】:

我创建了一个导航控制器。在第二个视图(被推送)中,我有一些 web 服务调用并放置一个覆盖视图和设置

self.view.userInteractionEnabled = NO ;

一旦网络服务调用完成,我将恢复到

self.view.userInteractionEnabled = YES ;

当我这样做时,除了导航栏上的按钮之外的所有其他按钮都被禁用。如何禁用这两个导航栏按钮项? (一个类似于后退按钮的按钮,弹出到第一个视图控制器,另一个按钮提供有关帮助的信息)。

我尝试过使用self.navigationItem.backBarButtonItem.enabled = NO。但我仍然可以点击按钮并导航到第一个屏幕。如何禁用这两个按钮?

【问题讨论】:

    标签: ios ios7 uinavigationbar


    【解决方案1】:

    试试这个

    推荐

    self.navigationItem.leftBarButtonItem.enabled = NO;
    
    self.navigationItem.rightBarButtonItem.enabled = NO;
    

    或通过

    简单地禁用

    在边缘情况下

    self.view.window.userInteractionEnabled = NO;
    

    更新: 最近Apple不允许启用/禁用后退按钮。取而代之的是,我们可以隐藏它。

    self.navigationItem.hidesBackButton = YES;
    

    【讨论】:

    • 两者都不起作用。我仍然可以点击按钮并导航到第一个视图控制器。
    • @Sravan 您是在情节提要中构建按钮还是动态构建按钮?我想动态构建可能会产生影响。将按钮添加到导航栏后尝试放置此逻辑
    【解决方案2】:

    如果您在 Swift 上运行,您可以执行以下操作

    self.navigationItem.rightBarButtonItem?.enabled = true
    

    这个 sn-p 将禁用按钮。

    【讨论】:

    • 这很好用!
    【解决方案3】:

    只需禁用您的 UINavigationController 视图和导航栏交互:

    self.navigationController.navigationBar.userInteractionEnabled = NO;
    self.navigationController.view.userInteractionEnabled = NO;
    

    并在您需要时启用它:

    self.navigationController.navigationBar.userInteractionEnabled = YES;
    self.navigationController.view.userInteractionEnabled = YES;
    

    【讨论】:

    • 这没用。我仍然可以点击按钮并导航到第一个视图控制器。
    • @Sravan 我刚刚编辑了我的答案,效果更好吗?
    • 禁用交互很好,您可以一次禁用一个按钮、导航栏按钮或整个窗口。但是,请确保您始终可以启用它们。您可能需要考虑将“禁用”逻辑包装在计时器中。例如,假设您开始下载但没有正确完成,您的应用程序会挂起吗?是否要触发重试?全部启用?
    • self.navigationController.view.userInteractionEnabled = NO;冻结整个屏幕?我不认为它会起作用?
    【解决方案4】:

    最新的 Swift:要隐藏后退按钮,您必须使用:

    self.navigationItem.setHidesBackButton(true, animated: false)
    

    注意:这可能会触发导航栏中的错误,当转换到没有后退按钮(或在其位置有 leftButton)的视图时,可能会导致工件出现在隐藏的后退按钮的位置.出现的工件要么是省略号“...”,要么是堆栈上前一个 viewController 的标题。我相信这个错误与苹果自己的示例代码项目“CustomizingUINavigationBar”中记录的错误有关,CustomBackButtonViewController.m

    【讨论】:

      【解决方案5】:
      - (void)viewDidLoad
      {
      [super viewDidLoad];
      self.navigationItem.leftBarButtonItem=nil;
      self.navigationItem.hidesBackButton=YES;
      }
      

      【讨论】:

        【解决方案6】:

        这段代码应该可以在 Swift 4.2 上运行

        self.navigationItem.rightBarButtonItem?.isEnabled = false
        

        上面的代码将禁用按钮。要启用它,将布尔值切换为 true

        【讨论】:

          【解决方案7】:

          试试这个代码:

          UIApplication.sharedApplication().beginIgnoringInteractionEvents()
          

          这将阻止用户与应用交互,服务调用后,再次编写此代码:

          UIApplication.sharedApplication().endIgnoringInteractionEvents()
          

          这当然会有所帮助。

          【讨论】:

          • 'beginIgnoringInteractionEvents()' 在 iOS 13.0 中已弃用
          【解决方案8】:

          真正禁用 UIBarButtonItem 的最简单方法如下:

          barButtonVar.isEnabled = false
          

          【讨论】:

            【解决方案9】:

            我只是通过向我的视图控制器添加一个属性来解决这个问题:

            @property (nonatomic, strong) IBOutlet UIBarButtonItem * RightButton;
            

            然后我将它连接到情节提要上的按钮。 然后,您可以随意设置其属性,例如:

            self.RightButton.enabled=true;
            

            【讨论】:

              【解决方案10】:

              为 Swift 3 更新:

              如果你想禁用导航栏按钮项或者你想禁用孔 UINavigationBar 即导航栏上存在的所有项目,请使用以下代码行;

              // if you want disable
              self.navigationController?.navigationBar.isUserInteractionEnabled = false
              
              // if you want enable again
              self.navigationController?.navigationBar.isUserInteractionEnabled = true
              

              享受...!

              【讨论】:

                【解决方案11】:

                对于 iOS 10.3 版本,swift 3:

                self.navigationItem.rightBarButtonItem?.isEnabled = false.
                

                【讨论】:

                  【解决方案12】:

                  Swift 5 和 iOS 13:

                  要删除所有左侧按钮或仅删除指定的一个,只需从 leftBarButtonItems 数组中删除。

                          self.navigationItem.leftBarButtonItems = []
                  

                  【讨论】:

                    【解决方案13】:

                    一条线解决方案

                    self.navigationItem.leftBarButtonItem.enabled = NO;
                    
                    self.navigationItem.rightBarButtonItem.enabled = NO;
                    

                    【讨论】:

                      【解决方案14】:

                      导航栏按钮项目必须通过 navigationItem 属性引用它们来切换。

                      例如:

                      func setupNav() {
                          let saveButton = UIBarButtonItem.init(barButtonSystemItem: .save, target: self, action: #selector(onSavePressed))
                          navigationItem.rightBarButtonItem = saveButton
                          saveButton.isEnabled = false
                        }
                      
                      func validateSave() {
                           saveButton.isEnabled = isConditionMet // WON'T work
                            navigationItem.rightBarButtonItem.isEnabled = isConditionMet // WORKS!
                      }
                      

                      【讨论】:

                        【解决方案15】:

                        斯威夫特 5

                        self.navigationItem.rightBarButtonItem?.isEnabled = true;
                        
                        self.navigationItem.rightBarButtonItem?.isEnabled = false;
                        

                        【讨论】:

                        • .isEnabled 已经在其他几个答案中提到过。在回答已有答案的旧问题时,请确保提供新颖的解决方案或比现有答案更好的解释。
                        【解决方案16】:
                        var menuBtn = new UIButton(UIButtonType.Custom);
                        menuBtn.Frame = new CGRect(x: 0.0, y: 0.0, width: 20, height: 20);
                        menuBtn.SetImage(new UIImage("filter"), UIControlState.Normal);
                        
                        menuBtn.Alpha = 0.05f;   //to set the Alpha
                        
                        menuBtn.Enabled = false;
                        

                        仅在 Mvvmcross Xamarin.iOS 上测试

                        【讨论】:

                          【解决方案17】:

                          斯威夫特 5 它适用于导航控制器

                          //禁用

                          self.navigationController?.navigationBar.isUserInteractionEnabled = false
                          

                          //启用

                          self.navigationController?.navigationBar.isUserInteractionEnabled = true
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2015-11-07
                            • 2014-01-16
                            • 2023-04-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多