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
}
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")
}
}
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
}
// 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.
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()
}
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
Wenn Sie UIBarButtonItem
s 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.
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
}
}
}
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
}
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.
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 :)
Ich habe es mit diesem gemacht:
navigationItem.setHidesBackButton(true, animated: true)
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
}