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
}
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")
}
}
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
}
// 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.
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()
}
Pour Swift 3
if (Show_condition) {
self.navigationItem.rightBarButtonItem = self.addAsset_btn
}
else {
self.navigationItem.rightBarButtonItem = nil
}
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
}
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
Si vous avez défini UIBarButtonItem
s à 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.
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
}
}
}
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
}
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.
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 :)
Je l'ai fait en utilisant ceci:
navigationItem.setHidesBackButton(true, animated: true)
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
}