【问题标题】:Make a UIBarButtonItem disappear using swift IOS使用 swift IOS 使 UIBarButtonItem 消失
【发布时间】:2014-10-18 23:48:32
【问题描述】:

我有一个从故事板链接到的 IBOutlet

@IBOutlet var creeLigueBouton: UIBarButtonItem!

如果条件为真,我想让它消失

if(condition == true)
{
    // Make it disappear
}

【问题讨论】:

    标签: swift conditional-statements uibarbuttonitem iboutlet


    【解决方案1】:

    你真的想隐藏/显示creeLigueBouton吗?相反,启用/禁用 UIBarButtonItems 要容易得多。你可以用几行代码来做到这一点:

    if(condition == true) {
        creeLigueBouton.enabled = false
    } else {
        creeLigueBouton.enabled = true
    }
    

    这段代码甚至可以用更短的方式重写:

    creeLigueBouton.enabled = !creeLigueBouton.enabled
    

    让我们在 UIViewController 子类中查看它:

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var creeLigueBouton: UIBarButtonItem!
    
        @IBAction func hide(sender: AnyObject) {
            creeLigueBouton.enabled = !creeLigueBouton.enabled
        }
    
    }
    

    如果你真的想显示/隐藏creeLigueBouton,你可以使用下面的代码:

    import UIKit
    
    class ViewController: UIViewController {
    
        var condition: Bool = true
        var creeLigueBouton: UIBarButtonItem! //Don't create an IBOutlet
    
        @IBAction func hide(sender: AnyObject) {
            if(condition == true) {
                navigationItem.rightBarButtonItems = []
                condition = false
            } else {
                navigationItem.rightBarButtonItems = [creeLigueBouton]
                condition = true
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            creeLigueBouton = UIBarButtonItem(title: "Creer", style: UIBarButtonItemStyle.Plain, target: self, action: "creerButtonMethod")
            navigationItem.rightBarButtonItems = [creeLigueBouton]
        }
    
        func creerButtonMethod() {
            print("Bonjour")
        }
    
    }
    

    【讨论】:

    • 非常感谢,这正是我想要的
    • 对于禁用的按钮是否可以修改文本颜色?
    • 找了好久,到现在为止都是完美的答案。
    【解决方案2】:

    以下解决方案对我有用。

            var skipButton: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
        skipButton.frame = CGRectMake(10.0, 0.0, 58.0, 32.0);
        skipButton.setTitle("Skip", forState: UIControlState.Normal)
        skipButton.setTitleColor(UIColor(red: 0.0, green: 122.0/255.0, blue: 255.0/255.0, alpha: 1.0), forState: UIControlState.Normal)
        skipButton.addTarget(self, action: "rightButtonAction:", forControlEvents: UIControlEvents.TouchUpInside)
        var skipButtonItem = UIBarButtonItem(customView: skipButton)
        self.navigationItem.rightBarButtonItem = skipButtonItem;
    
        if hideSkipButton == true {
            self.navigationItem.rightBarButtonItem = nil
        } 
    

    【讨论】:

      【解决方案3】:

      我在工具栏上遇到了同样的问题,我不得不隐藏并显示它的最后一个按钮。所以我声明了一个 var 来保存 UIBarButtonItem 并将其从栏中删除或根据情况添加:

      在类中声明了 var 并链接了工具栏:

      var buttonToHide : UIBarButtonItem?
      
      @IBOutlet weak var toolbarOne: UIToolbar!
      

      在 viewDidLoad :

      buttonToHide = toolbarOne.items![toolbarOne.items!.count - 1] as? UIBarButtonItem
      

      在我的代码中我成功了:

      if situationOccurrsToHide {
         toolbarOne.items!.removeLast()
      }
      

      if situationOccursToShow 
      {    
         toolbarOne.items!.append(buttonToHide!) 
      }
      

      您可以使用 removeAtIndex 或 insert(buttonToHide, atIndex: xx) 在特定位置删除或重新插入按钮。

      您必须小心不要多次插入或移除按钮。

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        第一种方式:

        只需将.title 设置为""

        第二种方式:

        只要您想显示/隐藏creeLigueBouton,只需致电updateToolBar()

        func updateToolBar() {
            var barItems: [UIBarButtonItem] = []
        
            if condition != true {
                // Make it appear
                barItems.append(creeLigueBouton)
            }
        
            barItems.append(anotherButton)
        
            myToolBar.setItems(barItems, animated: true)
        
            myToolBar.setNeedsLayout()
        }
        

        【讨论】:

        • @JSA986 是的......这是真的
        • (即使条形按钮项没有标题,第二种方式也有效)
        • 第二种方法不起作用,除非您创建一个强大的插座引用或以编程方式实例化您的按钮
        【解决方案5】:

        这是我的解决方案:

        隐藏:

        self.creeLigueBouton.title = ""
        self.creeLigueBouton.style = UIBarButtonItemStyle.Plain
        self.creeLigueBouton.enabled = false
        

        显示:

        self.creeLigueBouton.title = "Original Button Text"
        self.creeLigueBouton.style = UIBarButtonItemStyle.Bordered
        self.creeLigueBouton.enabled = true
        

        【讨论】:

          【解决方案6】:

          如果您有一组 UIBarButtonItems 来隐藏,例如仅在横向显示它们,隐藏或纵向,您可以使用标签和 Swift Array 的过滤器。假设我们将@IBOutlet 链接到UIToolBar

          @IBOutlet weak var toolbar: UIToolbar!
          

          首先,我们将工具栏的项目保存在viewDidLoad

          override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            toolbarItems = toolbar.items
          }
          

          将要在横向显示的 UIBarButtonItem 的 tag 属性设置为 1 或任何您喜欢的值。然后,覆盖 func traitCollectionDidChange

          override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
              super.traitCollectionDidChange(previousTraitCollection)
          
              switch (traitCollection.horizontalSizeClass, traitCollection.verticalSizeClass) {
              case (.Compact, .Regular): // iPhone Portrait
                let items: [UIBarButtonItem]?
                if view.frame.width > 320 { // iPhone 6 & 6S
                  items = toolbarItems?.filter({ $0.tag < 5 })
                } else { 
                  items = toolbarItems?.filter({ $0.tag < 4 })
                }
                bottomToolbar.setItems(items, animated: true)
              case (_, .Compact): // iPhone Landscape
                let items = toolbarItems?.filter({ $0.tag < 6 })
                bottomToolbar.setItems(items, animated: true)
              default: // iPad
                break
              }
            }
          

          在此示例中,我将所有UIBarButtonItem 的标签设置为仅适用于 iPad 的 6、iPhone Landscape 的标签为 5,以及适用于 iPhone 6 和 6+ 的标签为 4。

          【讨论】:

            【解决方案7】:

            您可以使用文本属性来隐藏条形按钮:

            barButton.enabled = false
            barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)
            

            我还为 UIBarButtonItem 做了一个隐藏属性的扩展:

            extension UIBarButtonItem {
            
                var titleTextAttributes: [NSObject : AnyObject]! {
                    set {
                        setTitleTextAttributes(newValue, forState: .Normal)
                    }
            
                    get {
                        return titleTextAttributesForState(.Normal)
                    }
            
                }
            
                private static var savedAttributesKey = "savedAttributes"
            
                var savedAttributes: [NSObject : AnyObject]? {
                    set {
                        objc_setAssociatedObject(self, &UIBarButtonItem.savedAttributesKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
                    }
                    get {
                        return objc_getAssociatedObject(self, &UIBarButtonItem.savedAttributesKey) as? [NSObject : AnyObject]
                    }
                }
            
                var hidden: Bool {
                    set {
                        enabled = !newValue
            
                        if newValue {
                            savedAttributes = titleTextAttributes
            
                            // Set a clear text color
                            var attributes = titleTextAttributes
                            attributes[NSForegroundColorAttributeName] = UIColor.clearColor()
                            titleTextAttributes = attributes
                        }
                        else {
                            titleTextAttributes = savedAttributes
                        }
                    }
            
                    get {
                        return enabled
                    }
                }
            }
            

            【讨论】:

              【解决方案8】:

              试试这个。 (制作 newbackbutton 全局变量)

              覆盖 func viewDidLoad() {

                  let newBackButton = UIBarButtonItem()
              
                   newBackButton.title = " << Return to Gallery"
                  newBackButton.style  = UIBarButtonItemStyle.Done
                  newBackButton.target = self
                  newBackButton.action = "backtoScoutDetail:"
                  self.navigationItem.rightBarButtonItem = newBackButton
              

              }

              override func viewWillAppear(animated: Bool) {
              
                  newBackButton.title = ""
                  self.navigationItem.rightBarButtonItem = newBackButton        
              
                   }
              

              【讨论】:

                【解决方案9】:

                我是用这个来做的:

                navigationItem.setHidesBackButton(true, animated: true)
                

                【讨论】:

                • 正是我想要的,感谢您发布您的解决方案
                【解决方案10】:

                使用属性 enabled 和 tintColor

                    let barButtonItem:UIBarButtonItem? = nil
                
                    if isHidden{
                        barButtonItem?.enabled      = false
                        barButtonItem?.tintColor    = UIColor.clearColor()
                    }else{
                        barButtonItem?.enabled      = true
                        barButtonItem?.tintColor    = nil
                    }
                

                【讨论】:

                • 谢谢,伙计!为我工作。
                • 太棒了!效果很好
                【解决方案11】:
                Try these:
                
                 self.navigationController?.navigationBar.backItem?.title = ""
                        navigationItem.backBarButtonItem?.title = ""
                        navigationItem.leftBarButtonItem?.title = ""
                navigationItem.hidesBackButton = true
                
                
                        navigationItem.setLeftBarButtonItem(nil, animated: true)
                        navigationItem.setRightBarButtonItem(nil, animated: true)
                

                【讨论】:

                  【解决方案12】:
                  // Nice answer haiLong, I think as an extension this is more convenient.
                  
                  extension UIBarButtonItem {
                      var isHidden: Bool {
                          get {
                              return !isEnabled && tintColor == .clear
                          }
                          set {
                              tintColor = newValue ? .clear : nil
                              isEnabled = !newValue
                          }
                      }
                  }
                  

                  编辑:删除了强制展开和固定启用值。

                  【讨论】:

                  • 这很好,但是如果你的 UIBarButtonItem 包含一个 customView,它就不起作用,如果有,你可以直接在那个视图上调用 hidden。
                  【解决方案13】:

                  对于 Swift 3

                  if (your_condition) {
                    self.navigationItem.rightBarButtonItem = self.addAsset_btn
                   }
                  else {
                    // hide your button
                    self.navigationItem.rightBarButtonItem = nil
                   }
                  

                  【讨论】:

                    【解决方案14】:

                    我有超过 2 个菜单项,删除/添加菜单项是开销。这段代码 sn-p 为我工作(使用 Swift3)

                    func showMenuItem(){
                    
                        menuItemQuit.customView?.isHidden = false
                        menuItemQuit.plainView.isHidden = false
                    }
                    
                    func hideMenuItem(){
                    
                        menuItemQuit.customView?.isHidden = true
                        menuItemQuit.plainView.isHidden = true
                    }
                    

                    【讨论】:

                      【解决方案15】:

                      回复已经很晚了,但是在寻找我的问题的答案时,我找到了这个主题。标记的答案对我没有帮助,但由于@haiLong的回答,我设法解决了我的问题。我的解决方案适用于所有类型的条形按钮......我想。将此添加到您的 ViewController 并根据需要使用。

                      var tintColorsOfBarButtons = [UIBarButtonItem: UIColor]()
                      
                          func hideUIBarButtonItem(button: UIBarButtonItem) {
                              if button.tintColor != UIColor.clear {
                                  tintColorsOfBarButtons[button] = button.tintColor
                                  button.tintColor = UIColor.clear
                                  button.isEnabled = false
                              }
                          }
                      
                          func showUIBarButtonItem(button: UIBarButtonItem) {
                              if tintColorsOfBarButtons[button] != nil {
                                  button.tintColor = tintColorsOfBarButtons[button]
                              }
                              button.isEnabled = true
                          }
                      

                      我希望它可以为其他开发人员节省一些时间:)

                      【讨论】:

                        猜你喜欢
                        • 2012-06-08
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多