web-dev-qa-db-de.com

Machen Sie ein UIBarButtonItem mit Swift verschwinden IOS

Ich habe ein IBOutlet, mit dem ich vom Storyboard aus verlinkt habe

@IBOutlet var creeLigueBouton: UIBarButtonItem!

und ich möchte es verschwinden lassen, wenn eine Bedingung wahr ist

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

Möchten Sie wirklich creeLigueBouton ausblenden/anzeigen? Stattdessen ist es viel einfacher, UIBarButtonItems zu aktivieren/deaktivieren. Sie würden dies mit ein paar Zeilen tun:

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

Dieser Code kann sogar kürzer geschrieben werden:

creeLigueBouton.enabled = !creeLigueBouton.enabled

Lassen Sie uns es in einer UIViewController-Unterklasse sehen:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var creeLigueBouton: UIBarButtonItem!

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

}

Wenn Sie wirklich creeLigueBouton anzeigen/ausblenden möchten, können Sie den folgenden Code verwenden:

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

Verwenden Sie die Eigenschaft enabled und 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
        }
    }
}

BEARBEITEN: Erzwungenes Entpacken und fester aktivierter Wert entfernt.

10
Marc

Erster Weg:

Setzen Sie einfach .title auf ""

Zweiter Weg:

Rufen Sie einfach updateToolBar() auf, wenn Sie die creeLigueBouton anzeigen/ausblenden möchten.

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

Für Swift 3

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

Die folgende Lösung funktioniert für mich.

        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
    } 

hier ist meine Lösung:

verbergen:

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

show:

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

Wenn Sie UIBarButtonItems zum Ausblenden festgelegt haben, z. Nur im Querformat anzeigen und ausblenden oder Hochformat. Sie können Tag- und Swift Array-Filter verwenden. Nehmen wir an, wir haben @IBOutlet verlinkt zu UIToolBar:

@IBOutlet weak var toolbar: UIToolbar!

Zuerst speichern wir die Elemente der Symbolleiste in viewDidLoad:

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

Setzen Sie die Tag-Eigenschaft von UIBarButtonItem, die Sie in Querformat anzeigen möchten, auf 1 oder was auch immer Sie möchten. Überschreiben Sie dann die Funktion 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
    }
  }

In diesem Beispiel habe ich alle UIBarButtonItem-Tags für iPad auf 6, iPhone Landscape auf 5 und für iPhone 6 & 6+ auf 4 gesetzt. 

1
roel

Sie können Textattribute verwenden, um eine Schaltflächenschaltfläche auszublenden:

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

Ich habe auch eine Erweiterung für UIBarButtonItem mit einer verborgenen Eigenschaft gemacht:

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

Versuche dies. (Newbackbutton globale Variable machen)

func viewDidLoad () überschreiben {

    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

Ich hatte das gleiche Problem mit einer Werkzeugleiste, die ich verstecken und die letzte Schaltfläche anzeigen musste. Also habe ich eine var zum UIBarButtonItem erklärt und aus der Leiste entfernt oder je nach Situation hinzugefügt:

innerhalb der Klasse wurde die Variable deklariert und die Symbolleiste verlinkt:

var buttonToHide : UIBarButtonItem?

@IBOutlet weak var toolbarOne: UIToolbar!

beim viewDidLoad: 

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

in meinem Code habe ich den Trick gemacht:

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

oder 

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

Sie können die Funktion removeAtIndex oder insert (buttonToHide, atIndex: xx) verwenden, um die Schaltfläche an einer bestimmten Position zu entfernen oder erneut einzufügen.

Sie müssen darauf achten, dass Sie die Schaltfläche nicht mehrmals einfügen oder entfernen. 

Ich hoffe es hilft.

0
Fabio Vaz

Es ist ziemlich spät zu antworten, aber auf der Suche nach einer Antwort für mein Problem fand ich dieses Thema. Die markierte Antwort hat mir nicht geholfen, aber dank der Antwort von @ haiLong konnte ich mein Problem lösen. Meine Lösung funktioniert für alle Arten von Balkenknöpfen ... denke ich. Fügen Sie dies Ihrem ViewController hinzu und verwenden Sie es nach Bedarf.

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
    }

Ich hoffe es spart Zeit für andere Entwickler :)

0
user2855896

Ich habe es mit diesem gemacht:

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

Ich habe mehr als 2 Menuitems und das Entfernen/Hinzufügen von Menuitem ist ein Overhead. Dieser Codeausschnitt funktionierte für mich (Using Swift3) .

func showMenuItem(){

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

func hideMenuItem(){

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