Jak pokazać / ukryć UIBarButtonItem?

251

Stworzyłem pasek narzędzi w IB z kilkoma przyciskami. Chciałbym móc ukryć / pokazać jeden z przycisków w zależności od stanu danych w oknie głównym.

UIBarButtonItem nie ma ukrytej właściwości, a wszelkie przykłady, które do tej pory ukryłem, obejmują ustawienie przycisków paska nawigacyjnego na zero, co nie wydaje mi się, że chcę to zrobić tutaj, ponieważ może być konieczne ponowne wyświetlenie przycisku (nie wspomnieć, że jeśli podłączę przycisk do IBOutleta, jeśli ustawię go na zero, nie jestem pewien, jak go odzyskam).

Sasha
źródło
Po prostu wyłączyłem go i dodałem etykietę dostępności informującą, że funkcja przycisku jest niedostępna.
Daniel Springer,

Odpowiedzi:

263

Zapisz swój przycisk w silnym gniazdku (nazwijmy go myButton) i zrób to, aby go dodać / usunąć:

// 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];
}

Ponieważ jest przechowywany w gnieździe, zachowasz odniesienie do niego, nawet jeśli nie ma go na pasku narzędzi.

Lnafziger
źródło
73
Aby działało to dla mojego prawego przycisku w kontrolerze nawigacyjnym, użyłem self.navigationItem.rightBarButtonItems i [self.navigationItem setRightBarButtonItems <prams>] zamiast toolBarItems i setToolBarItems.
MindSpiker,
@MindSpiker: Tak, ta sama technika działa również w przypadku przycisków na pasku nawigacyjnym.
lnafziger,
1
czy muszę zerować myButton w dealloc?
Van Du Tran,
48
Lub Apple mógł właśnie dodać .hidden property. -_-
GeneCode
217

Wiem, że na to pytanie spóźnia się odpowiedź. Może to jednak pomóc, jeśli ktoś stanie w podobnej sytuacji.

W iOS 7, aby ukryć element przycisku paska, możemy użyć następujących dwóch technik: -

  • use SetTitleTextAttributes: - Działa to świetnie na elementach przycisku paska, takich jak „Gotowe”, „Zapisz” itp. Jednak nie działa na elementach takich jak Dodaj, Symbol kosza itp. (przynajmniej dla mnie), ponieważ nie są to teksty.
  • użyj TintColor: - Jeśli mam element przycisku paska o nazwie „deleteButton”: -

Aby ukryć przycisk, użyłem następującego kodu:

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

Aby ponownie wyświetlić przycisk, użyłem następującego kodu:

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
Max
źródło
[self.navigationItem.rightBarButtonItem setEnabled: NO]; [self.navigationItem.rightBarButtonItem setTintColor: [UIColor clearColor]];
Leon
3
W przypadku Swift: deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()wyłączanie i ukrywanie oraz deleteButton.enabled = true; deleteButton.tintColor = nilponowne włączanie i wyświetlanie w normalny sposób.
Unixmonkey,
1
Podoba mi się, że to podejście pozwala mi na logikę, czy wyświetlać UIBarButton w tej klasie. Powód, dla którego działa tylko z jednym przyciskiem, nie jest od razu oczywisty - to dlatego, że jeśli ukryjesz przycisk w ten sposób, nadal będzie on zajmował miejsce, więc możesz mieć pustą przerwę, jeśli masz wiele przycisków.
SimplGy,
Twoje pierwsze podejście było dla mnie idealne. Ustawić UIColor.cleardla UIControlState.disabledi może pokazać / ukryć przycisk z setEnabled. Oczywiście, jak powiedziałeś, działa to tylko w przypadku przycisków tekstowych.
fl034,
Jeśli długo naciskam go, aż pojawi się na dużym obrazie (prawdopodobnie dla ułatwienia dostępu), to nawet jeśli isEnabled jest ustawiony na false, nadal działa.
Daniel Springer,
67

Oto proste podejście:

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

Właśnie uruchomiłem go na iPadzie z siatkówką, a .01 jest wystarczająco mały, aby się nie pojawił.

Drew Rosenberg
źródło
13
Ze wszystkich rozwiązań, to było szybkie, brudne i skuteczne. Dodałem również barbuttItem.enabled = NO; ponieważ wciąż mógłbym uruchomić przycisk, jeśli wystrzelę go wystarczająco.
Stickley,
1
Nie działa dla mnie. Myślałem, że dzieje się tak, ponieważ używałem przycisku Dodaj z obrazem „+”, ale zamiast tego spróbowałem przycisku niestandardowego z tekstem „Nowy” i nadal nie zniknie. Aktywacja zmienia się, więc wiem, że mój kod jest wykonywany. Jakieś pomysły? Pamiętaj, że ten przycisk jest tworzony w serii ujęć i ma segment, więc nie chcę zamiast tego zmieniać na przycisk programowy
Rabarbar
19
Nie działa na pasku narzędzi kontrolera nawigacji, ale działa na innych paskach narzędzi.
Drew Rosenberg,
3
Ukrywa go, ale nadal reaguje na stuknięcia. Dla mnie działa jak niewidoczny przycisk.
Tibidabo
Jeśli ustawiłeś globalny kolor odcienia za pomocą tej linii self.window?.tintColor = APP_PRIMARY_COLORw appdelegate, to nie zadziała
Mehul Thakkar
60

Można ukryć przycisk na miejscu bez zmiany jego szerokości lub usunięcia go z paska. Jeśli ustawisz styl na zwykły, usuniesz tytuł i wyłączysz przycisk, zniknie. Aby go przywrócić, po prostu cofnij zmiany.

-(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
źródło
2
To działało dla mnie po prostu ustawiając btn.title = zero. Ustawiam też włączone = NIE, na wszelki wypadek ...
Pork 'n' Bunny
3
Ustawienie buttonItem.title na zero nie działało dla mnie w iOS7. Przycisk nie pojawił się ponownie podczas przywracania. Jednak zadziałało ustawienie buttonItem.title = @ "";
Mark Knopper
42

Poniżej znajduje się moje rozwiązanie, chociaż szukałem go dla paska nawigacji.

navBar.topItem.rightBarButtonItem = nil;

Tutaj „navBar” to IBOutlet do paska nawigacji w widoku w XIB Tutaj chciałem ukryć przycisk lub pokazać go na podstawie pewnych warunków. Więc testuję warunek w warunku „If” i jeśli true, ustawiam przycisk na zero w metodzie viewDidLoad widoku docelowego.

Może to nie dotyczyć dokładnie twojego problemu, ale coś podobnego, jeśli chcesz ukryć przyciski na pasku nawigacji

Vishal Dharankar
źródło
Jeśli chcesz później ustawić rightBarButtonItemponownie, upewnij się, że element przycisku jest przechowywany w silnym IBOutletu, aby nie został zwolniony po zdjęciu go z paska nawigacji.
Nate,
30

W przypadku Swift 3 i Swift 4 możesz to zrobić, aby ukryć UIBarButtomItem:

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

I aby pokazać UIBarButtonItem:

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

Na tintColormusisz określić kolor pochodzenia, którego używasz dlaUIBarButtomItem

pableiros
źródło
2
Ale to nadal zajmie miejsce dla tego przycisku.
Makalele,
22

Obecnie używam OS X Yosemite Developer Preview 7 i Xcode 6 beta 6 ukierunkowanych na iOS 7.1 i następujące rozwiązanie działa dla mnie dobrze:

  • Utwórz ujście dla UINavigationItemi UIBarButtonItems
  • Uruchom następujący kod, aby go usunąć

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • Uruchom następujące kody, aby ponownie dodać przyciski

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];
Olcay Ertaş
źródło
Dzięki, to także najlepsza metoda, jaką znalazłem. Upewnij się tylko, że Twoje odwołania do przycisków są silne.
jyoung
Pamiętaj również, że działa to tylko wtedy, gdy masz tylko jeden przycisk. Przykład usunie WSZYSTKIE przyciski po tej stronie.
lnafziger
@ jyoung To działało dla mnie, ale dlaczego to ma znaczenie, jeśli referencja jest silna? Nie próbowałem w inny sposób, ale zwykle nie ustawiam tego w ten sposób, ponieważ nie jest to ustawienie domyślne.
Robert,
@Robert Chcesz użyć obiektu w późniejszym czasie, więc musisz upewnić się, że obiekt nie będzie zbierał śmieci po ustawieniu go na zero. Jeśli nic więcej nie zatrzymywało obiektu, gdy powiedziałeś elementowi przycisku na pasku, że możesz się go pozbyć, jego liczba referencyjna wyniesie 0 i będzie to śmieci.
2015
14

W moim projekcie wykorzystałem IBOutlety. Więc moim rozwiązaniem było:

@IBOutlet weak var addBarButton: UIBarButtonItem!

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

A kiedy będziesz musiał ponownie wyświetlić ten pasek, po prostu ustaw właściwości odwrócone.

W Swift 3 zamiast tego enableużyj isEnablewłaściwości.

Legowisko
źródło
13

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

Dmitrij Semenyuk
źródło
12

iOS 8. UIBarButtonItem z niestandardowym obrazem. Próbowałem na wiele różnych sposobów, większość z nich nie pomagała. Rozwiązanie Maxa setTintColornie zmieniło się na żaden kolor. Sam to wymyśliłem, myślałem, że przyda się komuś.

Do ukrywania:

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

Do pokazania:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
Rinto Rapheal
źródło
9

Wypróbuj w Swift , nie aktualizuj, tintColorjeśli masz jakiś projekt UIBarButtonItem, taki jak rozmiar czcionki w AppDelegate, to całkowicie zmieni wygląd twojego przycisku podczas wyświetlania.

W przypadku przycisku tekstowego zmiana tytułu może sprawić, że przycisk „zniknie”.

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
Jeffrey Neo
źródło
7

Odkryłem kolejne zmarszczki tintColori isEnabledpodejście sugerowane przez Maxa i innych - gdy VoiceOver jest włączony dla ułatwienia dostępu, a przycisk jest logicznie ukryty, kursor dostępności nadal będzie się skupiał na przycisku paska i oznajmił, że jest „przyciemniony” (tj. Ponieważ isEnabledjest ustawiono na false). Podejście w zaakceptowanej odpowiedzi nie cierpi z powodu tego efektu ubocznego, ale inną pracą, którą znalazłem, było ustawienie wartości isAccessibilityElementfalse podczas „ukrywania” przycisku:

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

A potem isAccessibilityElementpowrót do wartości „pokazywania” przycisku:

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

Utrzymywanie miejsca na przycisku paska na pasku nadal nie stanowiło problemu w moim przypadku, ponieważ ukrywaliśmy / pokazywaliśmy skrajnie lewe elementy przycisku na pasku.

Evan Kirkwood
źródło
6
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

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

A teraz po prostu zmień isHiddenwłaściwość.

Bartłomiej Semańczyk
źródło
5

Poprawa z odpowiedzi @lnafziger

Zapisz swoje Barbuttons w silnym gniazdku i zrób to, aby je ukryć / pokazać:

-(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];
    }
}

W razie potrzeby skorzystaj z funkcji poniżej.

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
umakanta
źródło
5

Wystarczy ustawić barButton.customView = UIView()i zobaczyć lewę

Jeff Ayan
źródło
To, co robi ta odpowiedź, pozwala wszystkim elastycznym rozmiarom działać. To naprawdę super wydajna odpowiedź. Prawdopodobnie w połączeniu z przedłużeniem byłoby idealnie.
Adrian_H
4

Nie ma sposobu, aby „ukryć” UIBarButtonItem, musisz usunąć go z superView i dodać z powrotem, gdy chcesz go ponownie wyświetlić.

Kyle Richter
źródło
To w rzeczywistości nie jest prawdą - metoda opisana przez Maxa działa dobrze.
Northernman
1
nothernman - Max nie jest właściwie poprawny. W rzeczywistości nie ukrywa przycisku w sposób, w jaki większość ludzi zdefiniowałaby „ukrywanie”. Po prostu czyni to niewidocznym i wyłącza interakcję użytkownika. Przycisk wciąż tam jest i zajmuje miejsce. Wszystko sprowadza się do tego, jak chcesz zdefiniować „ukryj”. Wierzę, że duch pierwotnego pytania chciał faktycznie usunąć / dodać je, a nie tylko uczynić go niewidocznym.
Michael Peterson,
4

Jest to długa lista odpowiedzi, ale na wypadek, gdyby ktoś chciał łatwo skopiować i wkleić szybkie rozwiązanie, oto

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
źródło
Nieźle, ale musisz podać UINavigationItem jako parametr, a nie UIToolbar, ponieważ prosi o ukrycie UIBarButtonItem. Zmodyfikowałem twoją funkcję w ten sposób: func hideToolbarItem (przycisk: UIBarButtonItem, withToolbar pasek narzędzi: UINavigationItem) {var toolbarButtons: [UIBarButtonItem] = toolbar.rightBarButtonItems! toolbarButtons.removeAtIndex (toolbarButtons.indexOf (przycisk)!) toolbar.setRightBarButtonItems (toolbarButtons, animowane: true)} i to działa świetnie
Kingalione 8.04.16
3

Jednym ze sposobów jest skorzystanie z initWithCustomView:(UIView *)właściwości przy przydzielaniu UIBarButtonItem. Podklasa dla UIViewbędzie miała właściwość ukryj / pokaż.

Na przykład:

1. Mają coś, UIButtonco chcesz ukryć / odkryć.

2. Ustaw UIButtonjako widok niestandardowy. Lubić :

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

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

3. Możesz ukryć / odkryć myButtonutworzony przez siebie.[myButton setHidden:YES];

iNoob
źródło
Nie zamknie to jednak przerwy między pozostałymi przyciskami: kiedy jest „ukryty”, na pasku narzędzi będzie pusty obszar.
lnafziger,
@lnafziger Tak, to prawda, ale nie przeczytałem wzmianki o OP na temat zamykania szczeliny między przyciskami, ale warto to zauważyć.
iNoob
1
Dzięki, twoja odpowiedź też jest przydatna, ale myślę, że większość ludzi, którzy chcą ukryć przycisk na pasku narzędzi, chce, aby wyglądał tak, jakby w ogóle go nie było (bez pustego obszaru). Jeśli jest to lewy lub prawy, nie miałoby to jednak znaczenia.
lnafziger,
Dobre punkty, iNoob i Inafziger - nie wspomniałem o tym w żaden sposób, ale tak, wolałbym, żeby nie było pustego miejsca.
Sasha
3

W przypadku wersji Swift oto kod:

Dla UINavigationBar:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil
Sohil R. Memon
źródło
2

Ustawienie koloru tekstu na wyraźny kolor, gdy element przycisku paska jest wyłączony, jest prawdopodobnie czystszą opcją. Nie ma dziwności, którą musisz wyjaśnić w komentarzu. Ponadto nie niszczysz przycisku, więc nadal zachowujesz powiązane sekwencje scenariuszy.

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

Jeśli chcesz ukryć element przycisku paska, możesz po prostu:

self.navigationItem.rightBarButton.enabled = NO;

To kiepskie, że nie ma ukrytej własności, ale daje to ten sam rezultat.

szczenięta
źródło
1
Miałem przycisk wewnątrz prawegoBarButtonItem. Więc ustawiłem włączone na NIE i zmieniłem obraz w stanie wyłączonym na zero. Działa jak urok ... Dzięki
Skywalker
świetny pomysł, jednak ustawienie obrazu na zero nie działało dla mnie, musiałem umieścić mały przezroczysty kwadrat o wymiarach 20 x 20 jako obraz
Lena Bru
2

W przypadku, gdy UIBarButtonItem zawiera obraz zamiast tekstu, możesz to zrobić, aby go ukryć: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

Artem Goryaev
źródło
2

Niektóre metody pomocnicze, które pomyślałem, że podzielę się w oparciu o zaakceptowaną odpowiedź lnafziger, ponieważ mam wiele pasków narzędzi i wiele przycisków w każdym:

-(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
źródło
2

Możesz łatwo uzyskać widok i ukryć go w ten sposób

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
Titouan de Bailleul
źródło
2

Jeśli używasz Swift 3

if (ShowCondition){
   self.navigationItem.rightBarButtonItem = self.addAsset_btn 
 } 
else {
   self.navigationItem.rightBarButtonItem = nil
 }
Museer Ahamad Ansari
źródło
2

Oto rozszerzenie, które sobie z tym poradzi.

extension UIBarButtonItem {

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

}

STOSOWANIE:

myBarButtonItem.isHidden = true
Harris
źródło
1

Uzupełniając odpowiedź Eli Burke'a, jeśli UIBarButtonItemzamiast tytułu masz obraz w tle, możesz użyć kodu:

-(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
źródło
0

Musisz manipulować tablicą toolbar.items.

Oto kod, którego używam do ukrywania i wyświetlania przycisku Gotowe. Jeśli przycisk znajduje się na skrajnej krawędzi paska narzędzi lub pomiędzy innymi przyciskami, pozostałe przyciski będą się poruszać, więc jeśli chcesz, aby Twój przycisk zniknął, umieść go jako ostatni przycisk w kierunku środka. Animuję ruch przycisku, aby uzyskać efekt, całkiem mi się podoba.

-(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];

}

więc teraz możesz użyć następującego kodu, aby wyświetlić przycisk

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

lub aby ukryć swój przycisk

[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;
Graham
źródło
0

W IB, jeśli pozostawisz tytuł przycisku pusty, nie pojawi się (nigdy nie zainicjowany?). Robię to często podczas opracowywania podczas aktualizacji interfejsu użytkownika, jeśli chcę, aby element przycisku paska zniknął w przypadku kompilacji bez usuwania go i usuwania wszystkich odniesień do gniazd.

Nie ma to takiego samego efektu w czasie wykonywania, ustawienie tytułu przycisku na zero nie spowoduje, że cały przycisk zniknie. Niestety tak naprawdę nie odpowiada na twoje pytanie, ale może być przydatne dla niektórych.

Edycja: Ta sztuczka działa tylko wtedy, gdy styl przycisku jest ustawiony na zwykły

precle1337
źródło
0

Dodam tutaj moje rozwiązanie, ponieważ nie mogłem go tutaj znaleźć. Mam przycisk dynamiczny, którego obraz zależy od stanu jednej kontrolki. Najprostszym rozwiązaniem było ustawienie obrazu, niljeśli kontrola nie była obecna. Obraz był aktualizowany za każdym razem, gdy kontrolka była aktualizowana, a zatem było to dla mnie optymalne. Dla pewności ustawiłem również enabledna NO.

Ustawienie minimalnej wartości szerokości nie działało w systemie iOS 7.

mkko
źródło
0

Z podziękowaniami dla @lnafziger, @MindSpiker, @vishal i in. glin,

Najprostszym linerem, do którego dotarłem dla pojedynczego prawego (lub lewego) przycisku paska jest:

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

Jak w:

@interface MyClass()

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

@end

@implementation

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

@end

Przetestowałem to i działa dla mnie (z silnym elementem przycisku przewodowego podłączonym przez IB).

Chris Conover
źródło
Działa to, jeśli masz tylko jeden przycisk, ale jeśli masz wiele przycisków, będziesz musiał użyć metody bardziej zgodnej z moją odpowiedzią.
lnafziger