Wie kann ich ein UIBarButtonItem ein- / ausblenden?

251

Ich habe in IB eine Symbolleiste mit mehreren Schaltflächen erstellt. Ich möchte in der Lage sein, eine der Schaltflächen abhängig vom Status der Daten im Hauptfenster auszublenden / anzuzeigen.

UIBarButtonItem hat keine versteckte Eigenschaft, und alle Beispiele, die ich bisher gefunden habe, um sie auszublenden, beinhalten das Setzen von Navigationsleistenschaltflächen auf Null, was ich hier nicht tun möchte, da ich die Schaltfläche möglicherweise erneut anzeigen muss (nicht Um das zu erwähnen, wenn ich meine Schaltfläche mit einem IBOutlet verbinde, wenn ich das auf Null setze, bin ich mir nicht sicher, wie ich es zurückbekommen würde.

Sasha
quelle
Ich habe es einfach deaktiviert und ein Eingabehilfen hinzugefügt, das besagt, dass die Funktion der Schaltfläche nicht verfügbar ist.
Daniel Springer

Antworten:

263

Speichern Sie Ihren Button in einer starken Steckdose (nennen wir ihn myButton) und tun Sie dies, um ihn hinzuzufügen / zu entfernen:

// Get the reference to the current toolbar buttons
NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy];

// This is how you remove the button from the toolbar and animate it
[toolbarButtons removeObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];

// This is how you add the button to the toolbar and animate it
if (![toolbarButtons containsObject:self.myButton]) {
    // The following line adds the object to the end of the array.  
    // If you want to add the button somewhere else, use the `insertObject:atIndex:` 
    // method instead of the `addObject` method.
    [toolbarButtons addObject:self.myButton];
    [self setToolbarItems:toolbarButtons animated:YES];
}

Da es in der Steckdose gespeichert ist, behalten Sie einen Verweis darauf, auch wenn es nicht in der Symbolleiste enthalten ist.

lnafziger
quelle
73
Damit dies für meine rechte Schaltfläche in einem Navigationscontroller funktioniert, habe ich anstelle von toolBarItems und setToolBarItems self.navigationItem.rightBarButtonItems und [self.navigationItem setRightBarButtonItems <prams>] verwendet.
MindSpiker
@MindSpiker: Ja, dieselbe Technik funktioniert auch für die Schaltflächen in einer Navigationsleiste.
lnafziger
1
Muss ich myButton im Dealloc auf Null setzen?
Van Du Tran
48
Oder Apple hätte einfach .hidden-Eigenschaft hinzufügen können. -_-
GeneCode
217

Ich weiß, dass diese Antwort für diese Frage zu spät ist. Es kann jedoch hilfreich sein, wenn sich jemand in einer ähnlichen Situation befindet.

In iOS 7 können Sie zum Ausblenden eines Balkenschaltflächenelements die folgenden zwei Techniken verwenden:

  • Verwendung SetTitleTextAttributes: - Dies funktioniert hervorragend bei Balkenschaltflächenelementen wie "Fertig", "Speichern" usw. Es funktioniert jedoch nicht bei Elementen wie Hinzufügen, Papierkorbsymbol usw. (zumindest nicht für mich), da es sich nicht um Texte handelt.
  • Verwenden Sie TintColor: - Wenn ich ein Balkenschaltflächenelement mit dem Namen "deleteButton" habe: -

Um die Schaltfläche auszublenden, habe ich den folgenden Code verwendet: -

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];

Um die Schaltfläche wieder anzuzeigen, habe ich den folgenden Code verwendet: -

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
Max
quelle
[self.navigationItem.rightBarButtonItem setEnabled: NO]; [self.navigationItem.rightBarButtonItem setTintColor: [UIColor clearColor]];
Leon
3
Für Swift: deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()Deaktivieren und Ausblenden sowie deleteButton.enabled = true; deleteButton.tintColor = nilerneutes Aktivieren und Anzeigen wie gewohnt.
Unixmonkey
1
Ich finde es gut, dass ich mit diesem Ansatz die Logik festlegen kann, ob der UIBarButton in dieser Klasse angezeigt werden soll oder nicht. Der Grund, warum es nur mit einer Schaltfläche funktioniert, ist nicht sofort offensichtlich. Wenn Sie eine Schaltfläche auf diese Weise ausblenden, nimmt sie immer noch Platz ein, sodass Sie möglicherweise eine leere Lücke haben, wenn Sie mehrere Schaltflächen haben.
Einfach
Ihr erster Ansatz war perfekt für mich. Ich habe UIColor.clearfür UIControlState.disabledund kann ein- / auszublenden die Schaltfläche mit setEnabled. Wie Sie bereits sagten, funktioniert dies natürlich nur für Textschaltflächen.
fl034
Wenn ich lange darauf drücke, bis es in einem großen Bild erscheint (wahrscheinlich aus Gründen der Barrierefreiheit), funktioniert es auch dann, wenn isEnabled auf false gesetzt ist.
Daniel Springer
67

Hier ist ein einfacher Ansatz:

hide:  barbuttonItem.width = 0.01;
show:  barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)

Ich habe es gerade auf meinem Retina-iPad ausgeführt und .01 ist klein genug, damit es nicht angezeigt wird.

Drew Rosenberg
quelle
13
Von allen Lösungen war diese schnell, schmutzig und effektiv. Ich habe auch barbuttItem.enabled = NO hinzugefügt. da ich den Knopf immer noch zum Feuern bringen könnte, wenn ich ihn genug drücke.
Stickley
1
Funktioniert bei mir nicht Ich dachte, das lag daran, dass ich eine Schaltfläche "Hinzufügen" mit dem Bild "+" verwendet habe, aber ich habe stattdessen eine benutzerdefinierte Schaltfläche mit dem Text "Neu" ausprobiert, die jedoch immer noch nicht verschwindet. Die Aktivierung ändert sich, sodass ich weiß, dass mein Code ausgeführt wird. Irgendwelche Ideen? Beachten Sie, dass diese Schaltfläche in einem Storyboard erstellt wurde und einen Übergang hat, sodass ich nicht stattdessen zu einer programmgesteuerten Schaltfläche wechseln möchte
Rhabarber
19
Es scheint nicht in einer Navigationscontroller-Symbolleiste zu funktionieren, aber in anderen Symbolleisten.
Drew Rosenberg
3
Es versteckt es, reagiert aber immer noch auf Klopfen. Für mich wirkt es wie ein unsichtbarer Knopf.
Tibidabo
Wenn Sie die globale Farbtonfarbe mithilfe dieser Linie self.window?.tintColor = APP_PRIMARY_COLORin appdelegate festgelegt haben, funktioniert dies nicht
Mehul Thakkar
60

Es ist möglich, eine Schaltfläche an Ort und Stelle auszublenden, ohne ihre Breite zu ändern oder sie aus der Leiste zu entfernen. Wenn Sie den Stil auf "Einfach" setzen, den Titel entfernen und die Schaltfläche deaktivieren, wird er ausgeblendet. Um es wiederherzustellen, kehren Sie einfach Ihre Änderungen um.

-(void)toggleBarButton:(bool)show
{
    if (show) {
        btn.style = UIBarButtonItemStyleBordered;
        btn.enabled = true;
        btn.title = @"MyTitle";
    } else {
        btn.style = UIBarButtonItemStylePlain;
        btn.enabled = false;
        btn.title = nil;
    }
}
Eli Burke
quelle
2
Dies funktionierte für mich, indem einfach btn.title = nil gesetzt wurde. Ich setze auch aktiviert = NEIN, nur für den Fall ...
Pork 'n' Bunny
3
Das Setzen von buttonItem.title auf nil hat bei iOS7 bei mir nicht funktioniert. Die Schaltfläche wurde beim Zurücksetzen nicht erneut angezeigt. Was jedoch funktionierte, war das Setzen von buttonItem.title = @ "";
Mark Knopper
42

Unten ist meine Lösung, obwohl ich nach Navigationsleiste gesucht habe.

navBar.topItem.rightBarButtonItem = nil;

Hier ist "navBar" ein IBOutlet zur NavigationBar in der Ansicht in XIB. Hier wollte ich die Schaltfläche ausblenden oder anzeigen, basierend auf einer bestimmten Bedingung. Also teste ich auf die Bedingung in "If" und wenn true, setze ich die Schaltfläche in der viewDidLoad-Methode der Zielansicht auf null.

Dies ist möglicherweise nicht genau für Ihr Problem relevant, aber etwas Ähnliches, wenn Sie Schaltflächen in der Navigationsleiste ausblenden möchten

Vishal Dharankar
quelle
Wenn Sie später rightBarButtonItemerneut festlegen möchten , stellen Sie sicher, dass das Schaltflächenelement in einem starken IBOutlet gespeichert ist, damit es nicht freigegeben wird, wenn Sie es aus der Navigationsleiste entfernen.
Nate
30

Für Swift 3 und Swift 4 können Sie Folgendes tun, um Folgendes auszublenden UIBarButtomItem:

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear

Und um das zu zeigen UIBarButtonItem:

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue

Auf der tintColormüssen Sie die Ursprungsfarbe angeben, die Sie für die verwendenUIBarButtomItem

Pableiros
quelle
2
Dies nimmt jedoch noch Platz für diese Schaltfläche ein.
Makalele
22

Ich verwende derzeit OS X Yosemite Developer Preview 7 und Xcode 6 Beta 6 für iOS 7.1 und die folgende Lösung funktioniert gut für mich:

  • Steckdose für UINavigationItemund UIBarButtonItems erstellen
  • Führen Sie den folgenden Code aus, um ihn zu entfernen

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • Führen Sie die folgenden Codes aus, um erneut Schaltflächen hinzuzufügen

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];
Olcay Ertaş
quelle
Danke, das ist auch die beste Methode, die ich gefunden habe. Stellen Sie einfach sicher, dass Ihre Verweise auf Ihre Schaltflächen stark sind.
Jyoung
Denken Sie auch daran, dass dies nur funktioniert, wenn Sie nur eine Schaltfläche haben. In diesem Beispiel werden ALLE Schaltflächen auf dieser Seite entfernt.
lnafziger
@jyoung Das hat bei mir funktioniert, aber warum ist es wichtig, wenn die Referenz stark ist? Ich habe es nicht anders versucht, aber normalerweise nicht so eingestellt, da es nicht die Standardeinstellung ist.
Robert
@Robert Sie möchten das Objekt zu einem späteren Zeitpunkt verwenden, daher müssen Sie sicherstellen, dass beim Sammeln des Objekts auf Null kein Müll gesammelt wird. Wenn nichts anderes das Objekt behalten würde, als Sie dem Balkenschaltflächenelement sagten, dass es in Ordnung ist, es zu entfernen, wäre die Referenzanzahl 0 und es würde Müll gesammelt.
Jyoung
14

Ich habe IBOutlets in meinem Projekt verwendet. Meine Lösung war also:

@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()

Und wenn Sie diese Leiste erneut anzeigen müssen, legen Sie einfach die umgekehrten Eigenschaften fest.

Verwenden Sie in Swift 3 stattdessen enabledie isEnableEigenschaft.

Den
quelle
13

self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

Dmitry Semenyuk
quelle
12

iOS 8. UIBarButtonItem mit benutzerdefiniertem Bild. Versuchte viele verschiedene Wege, die meisten halfen nicht. Max 'Lösung, die setTintColorsich nicht in eine Farbe änderte. Ich habe das selbst herausgefunden und dachte, es wird jemandem von Nutzen sein.

Zum Verstecken:

[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];

Zum Zeigen:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
Rinto Rapheal
quelle
9

Versuchen Sie es in Swift . Aktualisieren Sie das nicht, tintColorwenn Sie ein Design für Ihr UIBarButtonItem wie die Schriftgröße in AppDelegate haben. Dadurch wird das Erscheinungsbild Ihrer Schaltfläche beim Anzeigen vollständig geändert.

Im Falle einer Textschaltfläche kann das Ändern des Titels dazu führen, dass Ihre Schaltfläche "verschwindet".

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
Jeffrey Neo
quelle
7

Ich entdeckte eine andere Falte in der tintColorund isEnablednähern von Max und andere vorgeschlagen - wenn Voiceover für die Barrierefreiheit aktiviert ist und der Knopf ist logisch versteckt, noch die Zugänglichkeit Cursor auf der Bar - Taste konzentrieren, und erklären , dass es „gedimmt“ (dh da isEnabledheißt auf false gesetzt). Der Ansatz in der akzeptierten Antwort leidet nicht unter diesem Nebeneffekt, aber eine andere Lösung, die ich gefunden habe, war, isAccessibilityElementbeim "Ausblenden" der Schaltfläche auf "falsch" zu setzen :

deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false

Und dann isAccessibilityElementzurück auf true setzen, wenn die Schaltfläche "angezeigt" wird:

deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true

In meinem Fall war es kein Problem, dass das Balkenschaltflächenelement immer noch Platz beansprucht, da wir die am weitesten links liegenden rechten Balkenschaltflächenelemente versteckt / angezeigt haben.

Evan Kirkwood
quelle
6
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}

Und jetzt einfach das isHiddenEigentum wechseln .

Bartłomiej Semańczyk
quelle
5

Verbesserung von @lnafziger Antwort

Speichern Sie Ihre Barbuttons in einer starken Steckdose und tun Sie dies, um sie zu verbergen / anzuzeigen :

-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you remove the button from the toolbar and animate it
    [navBarBtns removeObject:myButton];
    [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}


-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you add the button to the toolbar and animate it
    if (![navBarBtns containsObject:myButton]) {
        [navBarBtns addObject:myButton];
        [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
    }
}

Wenn jemals erforderlich, verwenden Sie unten Funktion ..

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
umakanta
quelle
5

Einfach einstellen barButton.customView = UIView()und den Trick sehen

Jeff Ayan
quelle
Diese Antwort ermöglicht es, dass alle flexiblen Größen funktionieren. Es ist eigentlich eine super effiziente Antwort. Wahrscheinlich in Verbindung mit einer Erweiterung wäre es perfekt.
Adrian_H
4

Es gibt keine Möglichkeit, ein UIBarButtonItem zu "verbergen". Sie müssen es aus der SuperView entfernen und wieder hinzufügen, wenn Sie es erneut anzeigen möchten.

Kyle Richter
quelle
Dies ist eigentlich nicht wahr - die von Max beschriebene Methode funktioniert gut.
Nordmann
1
nothernman - Max ist eigentlich nicht richtig. Er versteckt den Knopf nicht so, wie die meisten Leute "Verstecken" definieren würden. Er macht es einfach nicht sichtbar und deaktiviert die Benutzerinteraktion. Der Knopf ist noch da und nimmt Platz ein. Es kommt darauf an, wie Sie "verstecken" definieren möchten. Ich glaube, der Geist der ursprünglichen Frage wollte es tatsächlich entfernen / hinzufügen, nicht nur unsichtbar machen.
Michael Peterson
4

Dies ist ein langer Weg in der Antwortliste, aber nur für den Fall, dass jemand ein einfaches Kopieren und Einfügen für die schnelle Lösung wünscht, hier ist es

func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
    toolbar.setItems(toolbarButtons, animated: true)
}

func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    if !toolbarButtons.contains(button) {
        toolbarButtons.insert(button, atIndex: index)
        toolbar.setItems(toolbarButtons, animated:true);
    }
}
Maninvan
quelle
Nicht schlecht, aber Sie müssen ein UINavigationItem als Parameter und nicht UIToolbar angeben, da er ein UIBarButtonItem ausblenden möchte. Ich habe Ihre Funktion folgendermaßen geändert: func hideToolbarItem (Schaltfläche: UIBarButtonItem, withToolbar-Symbolleiste: UINavigationItem) {var toolbarButtons: [UIBarButtonItem] = toolbar.rightBarButtonItems! toolbarButtons.removeAtIndex (toolbarButtons.indexOf (button)!) toolbar.setRightBarButtonItems (toolbarButtons, animiert: true)} und das funktioniert großartig
Kingalione
3

Eine Möglichkeit, dies zu tun, besteht darin, die initWithCustomView:(UIView *)Eigenschaft von bei der Zuweisung von zu verwenden UIBarButtonItem. Die Unterklasse für UIViewhat die Eigenschaft zum Ein- und Ausblenden.

Beispielsweise:

1. Haben Sie eine, UIButtondie Sie ein- / ausblenden möchten.

2. Machen Sie die UIButtonals benutzerdefinierte Ansicht. Mögen :

UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button

UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];

3. Sie können das, was myButtonSie erstellt haben, ein- und ausblenden .[myButton setHidden:YES];

iNoob
quelle
Die Lücke zwischen den anderen Schaltflächen wird jedoch nicht geschlossen: Wenn sie "ausgeblendet" ist, wird in der Symbolleiste ein leerer Bereich angezeigt.
lnafziger
@lnafziger Ja, das stimmt, aber ich habe die OP-Erwähnung über das Schließen der Lücke zwischen den Tasten nicht gelesen, aber es ist ein guter Punkt, den man beachten sollte.
iNoob
1
Vielen Dank, Ihre Antwort ist auch nützlich, aber ich denke, dass die meisten Leute, die eine Schaltfläche in einer Symbolleiste ausblenden möchten, möchten, dass sie so aussieht, als wäre sie überhaupt nicht vorhanden (ohne den leeren Bereich). Wenn es das linke oder das rechte ist, wäre es jedoch nicht wirklich wichtig.
lnafziger
Gute Punkte, iNoob und Inafziger - ich habe es so oder so nicht erwähnt, aber ja, ich würde es vorziehen, wenn es keine leere Stelle gibt.
Sasha
3

Für die Swift-Version ist hier der Code:

Für UINavigationBar:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil
Sohil R. Memon
quelle
2

Das Einstellen der Textfarbe auf eine klare Farbe, wenn das Balkenschaltflächenelement deaktiviert ist, ist wahrscheinlich eine sauberere Option. Es gibt keine Verrücktheit, die Sie in einem Kommentar erklären müssen. Außerdem zerstören Sie die Schaltfläche nicht, sodass Sie die zugehörigen Storyboard-Abschnitte beibehalten.

[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
                                                      forState:UIControlStateDisabled];

Wann immer Sie möchten, dass das Balkenschaltflächenelement ausgeblendet wird, können Sie einfach Folgendes tun:

self.navigationItem.rightBarButton.enabled = NO;

Es ist lahm, dass es keine versteckten Eigenschaften gibt, aber dies bietet das gleiche Ergebnis.

Welpenbits
quelle
1
Ich hatte eine Schaltfläche im rightBarButtonItem. Also habe ich es auf NO gesetzt und sein Image im deaktivierten Zustand auf Null geändert. Arbeitete wie ein Zauber ... Danke
Skywalker
Ausgezeichnete Idee, aber das Setzen des Bildes auf Null hat bei mir nicht funktioniert. Ich musste ein kleines transparentes Quadrat von 20x20 als Bild einfügen
Lena Bru
2

Falls das UIBarButtonItem ein Bild anstelle des Textes enthält, können Sie dies tun, um es auszublenden: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

Artem Goryaev
quelle
2

Einige Hilfsmethoden, von denen ich dachte, ich würde sie basierend auf der akzeptierten Antwort von lnafziger teilen, da ich jeweils mehrere Symbolleisten und mehrere Schaltflächen habe:

-(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    [toolbarButtons removeObject:button];
    [toolbar setItems:toolbarButtons animated:NO];
}

-(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    if (![toolbarButtons containsObject:button]){
        [toolbarButtons insertObject:button atIndex:index];
        [self setToolbarItems:toolbarButtons animated:YES];
    }
}
Guy Lowe
quelle
2

Sie können die Ansicht leicht abrufen und auf diese Weise ausblenden

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
Titouan de Bailleul
quelle
2

Wenn Sie Swift 3 verwenden

if (ShowCondition){
   self.navigationItem.rightBarButtonItem = self.addAsset_btn 
 } 
else {
   self.navigationItem.rightBarButtonItem = nil
 }
Museer Ahamad Ansari
quelle
2

Hier ist eine Erweiterung, die dies erledigt.

extension UIBarButtonItem {

    var isHidden: Bool {
        get {
            return tintColor == .clear
        }
        set {
            tintColor = newValue ? .clear : .white //or whatever color you want
            isEnabled = !newValue
            isAccessibilityElement = !newValue
        }
    }

}

VERWENDUNG:

myBarButtonItem.isHidden = true
Harris
quelle
1

Ergänzend zu Eli Burkes Antwort UIBarButtonItemkönnen Sie den folgenden Code verwenden , wenn Sie ein Hintergrundbild anstelle eines Titels haben:

-(void)toggleLogoutButton:(bool)show{
    if (show) {
        self.tabButton.style = UIBarButtonItemStyleBordered;
        self.tabButton.enabled = true;
        UIImage* imageMap = [UIImage imageNamed:@"btn_img.png"];
        [((UIButton *)[self.tabButton customView]) setBackgroundImage:imageMap forState:UIControlStateNormal];
    } else {
        self.tabButton.style = UIBarButtonItemStylePlain;
        self.tabButton.enabled = false;
        [((UIButton *)[self.tabButton customView]) setBackgroundImage:nil forState:UIControlStateNormal];
    }
}
Renato Lochetti
quelle
0

Sie müssen das Array toolbar.items bearbeiten.

Hier ist ein Code, den ich zum Ausblenden und Anzeigen einer Schaltfläche "Fertig" verwende. Befindet sich Ihre Schaltfläche am äußersten Rand der Symbolleiste oder zwischen anderen Schaltflächen, bewegen sich Ihre anderen Schaltflächen. Wenn Sie also möchten, dass Ihre Schaltfläche einfach verschwindet, platzieren Sie Ihre Schaltfläche als letzte Schaltfläche in Richtung Mitte. Ich animiere die Tastenbewegung für den Effekt, es gefällt mir sehr gut.

-(void)initLibraryToolbar {

    libraryToolbarDocumentManagementEnabled = [NSMutableArray   arrayWithCapacity:self.libraryToolbar.items.count];
    libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
    [libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
    [libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
    trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
    mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
    [libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
    trashCan.enabled = NO;
    mail.enabled = NO;
    [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];

}}

Verwenden Sie jetzt den folgenden Code, um Ihre Schaltfläche anzuzeigen

[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES; 

oder um deine Schaltfläche auszublenden

[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;
Graham
quelle
0

Wenn Sie in IB den Titel der Schaltfläche leer lassen, wird er nicht angezeigt (nie initialisiert?). Ich mache dies häufig während der Entwicklung während der UI-Updates, wenn ein Balkenschaltflächenelement für einen Build vorübergehend ausgeblendet werden soll, ohne es zu löschen und alle seine Outlet-Referenzen zu löschen.

Dies hat zur Laufzeit nicht den gleichen Effekt. Wenn Sie den Titel der Schaltfläche auf Null setzen, wird nicht die gesamte Schaltfläche ausgeblendet. Entschuldigung, beantwortet Ihre Frage nicht wirklich, kann aber für einige nützlich sein.

Bearbeiten: Dieser Trick funktioniert nur, wenn der Stil der Schaltfläche auf "Einfach" eingestellt ist

Brezeln1337
quelle
0

Ich werde meine Lösung hier hinzufügen, da ich sie hier noch nicht finden konnte. Ich habe eine dynamische Schaltfläche, deren Bild vom Status eines Steuerelements abhängt. Die einfachste Lösung für mich war, das Bild auf einzustellen, nilwenn das Steuerelement nicht vorhanden war. Das Bild wurde jedes Mal aktualisiert, wenn das Steuerelement aktualisiert wurde, und daher war dies für mich optimal. Nur um sicherzugehen auch stelle ich das enabledanNO .

Das Festlegen der Breite auf einen minimalen Wert funktionierte unter iOS 7 nicht.

mkko
quelle
0

Mit freundlicher Genehmigung von @lnafziger, @MindSpiker, @vishal, et. al,

Der einfachste Liner, zu dem ich für eine einzelne rechte (oder linke) Balkentaste gekommen bin, ist:

self.navigationItem.rightBarButtonItem = <#StateExpression#>
    ? <#StrongPropertyButton#> : nil;

Wie in:

@interface MyClass()

@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;

@end

@implementation

- (void) updateState
{
    self.navigationItem.rightBarButtonItem = <#StateExpression#>
        ? <#StrongPropertyButton#> : nil;
}

@end

Ich habe dies getestet und es funktioniert für mich (mit dem über IB verdrahteten starken Balkenknopfelement).

Chris Conover
quelle
Dies funktioniert, wenn Sie nur eine Schaltfläche haben, aber wenn Sie mehrere Schaltflächen haben, müssen Sie eine Methode verwenden, die eher meiner Antwort entspricht.
lnafziger