web-dev-qa-db-fra.com

Faire disparaître un UIBarButtonItem en utilisant Swift IOS

J'ai un lien IBOutlet auquel je suis lié depuis le storyboard

@IBOutlet var creeLigueBouton: UIBarButtonItem!

et je veux le faire disparaître si une condition est vraie

if(condition == true)
{
    // Make it disappear
}
27
Clément Bisaillon

Voulez-vous vraiment masquer/afficher creeLigueBouton? Il est en revanche beaucoup plus facile d'activer/désactiver vos UIBarButtonItems. Vous feriez cela avec quelques lignes:

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

Ce code peut même être réécrit de manière plus courte:

creeLigueBouton.enabled = !creeLigueBouton.enabled

Voyons cela dans une sous-classe UIViewController:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var creeLigueBouton: UIBarButtonItem!

    @IBAction func hide(sender: AnyObject) {
        creeLigueBouton.enabled = !creeLigueBouton.enabled
    }

}

Si vous voulez vraiment afficher/masquer creeLigueBouton, vous pouvez utiliser le code suivant:

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")
    }

}
32
Imanou Petit

Utilisez la propriété enabled et tintColor

    let barButtonItem:UIBarButtonItem? = nil

    if isHidden{
        barButtonItem?.enabled      = false
        barButtonItem?.tintColor    = UIColor.clearColor()
    }else{
        barButtonItem?.enabled      = true
        barButtonItem?.tintColor    = nil
    }
38
haiLong
// 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
        }
    }
}

EDIT: Suppression du déballage forcé et de la valeur activée fixe.

10
Marc

Première voie:

Il suffit de mettre .title à ""

Deuxième voie:

Appelez simplement updateToolBar() chaque fois que vous souhaitez afficher/masquer la creeLigueBouton.

func updateToolBar() {
    var barItems: [UIBarButtonItem] = []

    if condition != true {
        // Make it appear
        barItems.append(creeLigueBouton)
    }

    barItems.append(anotherButton)

    myToolBar.setItems(barItems, animated: true)

    myToolBar.setNeedsLayout()
}
5
He Yifei 何一非

Pour Swift 3

if (Show_condition) {
  self.navigationItem.rightBarButtonItem = self.addAsset_btn
 }
else {
  self.navigationItem.rightBarButtonItem = nil
 }
5

La solution suivante fonctionne pour moi.

        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
    } 
2

voici ma solution:

cacher:

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

spectacle:

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

Si vous avez défini UIBarButtonItems à masquer, par exemple affichez-les uniquement en orientation Paysage, et masquer ou Portrait, vous pouvez utiliser le filtre de balises et Swift Array. Supposons que nous avons créé un lien @IBOutlet vers UIToolBar:

@IBOutlet weak var toolbar: UIToolbar!

Tout d’abord, nous enregistrons les éléments de la barre d’outils dans viewDidLoad:

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

Définissez la propriété de balise de UIBarButtonItem que vous souhaitez afficher en orientation Paysage sur 1 ou ce que vous préférez. Ensuite, remplacez 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
    }
  }

Dans cet exemple, je règle toutes les balises UIBarButtonItem pour iPad uniquement sur 6, iPhone Landscape sur 5 et pour iPhone 6 & 6+ sur 4. 

1
roel

Vous pouvez utiliser des attributs de texte pour masquer un bouton de barre:

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

Aussi, j'ai fait l'extension pour UIBarButtonItem avec une propriété cachée:

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
        }
    }
}
0
iUrii

Essaye ça. (Créer une variable globale newbackbutton)

remplacer 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        

     }
0
A.G

J'ai eu le même problème avec une barre d'outils que je devais cacher et montrer son dernier bouton. J'ai donc déclaré une variable pour contenir le UIBarButtonItem et l'ai supprimé de la barre ou ajouté en fonction de la situation, par exemple:

à l'intérieur de la classe a déclaré la var et lié à la barre d'outils:

var buttonToHide : UIBarButtonItem?

@IBOutlet weak var toolbarOne: UIToolbar!

sur le viewDidLoad: 

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

dans mon code j'ai fait le tour:

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

ou 

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

Vous pouvez utiliser removeAtIndex ou insert (buttonToHide, atIndex: xx) pour supprimer ou réinsérer le bouton à une position spécifique.

Veillez à ne pas insérer ou supprimer le bouton plus d'une fois. 

J'espère que ça aide.

0
Fabio Vaz

Il est assez tard pour répondre, mais cherchant une réponse à mon problème, j'ai trouvé ce sujet. La réponse marquée ne m'a pas aidé, mais j'ai réussi à résoudre mon problème grâce à la réponse de @ haiLong. Ma solution fonctionne pour tous les types de boutons de barres ... je pense. Ajoutez ceci à votre ViewController et utilisez-le au besoin.

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
    }

J'espère que cela fera gagner un peu de temps aux autres développeurs :)

0
user2855896

Je l'ai fait en utilisant ceci:

navigationItem.setHidesBackButton(true, animated: true)
0
Nuno Gonçalves

J'ai plus que 2 menuitem et enlever/ajouter menuitem est un overhead. Cet extrait de code a fonctionné pour moi (Using Swift3) .

func showMenuItem(){

    menuItemQuit.customView?.isHidden = false
    menuItemQuit.plainView.isHidden = false
}

func hideMenuItem(){

    menuItemQuit.customView?.isHidden = true
    menuItemQuit.plainView.isHidden = true
}
0
Manikanta