Jak dodać przycisk do UINavigationBar?

Odpowiedzi:

294

Przykładowy kod do ustawienia rightbuttonna NavigationBar.

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
    style:UIBarButtonItemStyleDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];

Ale normalnie miałbyś NavigationController, umożliwiający ci napisanie:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Mads Mobæk
źródło
1
Otrzymuję ostrzeżenie dotyczące stylu: parametr -> ostrzeżenie: Problem semantyczny: Niejawna konwersja z typu wyliczenia „UIBarButtonSystemItem” na inny typ wyliczenia „UIBarButtonItemStyle”
pojo
3
Powinien to być initWithBarButtonSystemItem: UIBarButtonSystemItemDone, aby uniknąć ostrzeżenia.
JordanC,
2
W tym przykładzie nie rozumiem, skąd pochodzi „słupek”. Jaka jest domyślna właściwość górnego paska dla UINavigationItem?
aneuryzm
Zmienna paska w odpowiedzi to dowolny pasek nawigacji, który nie jest zarządzany przez kontroler nawigacyjny. Jeśli masz kontroler nawigacji, ma on własny pasek nawigacyjny, którym zarządza - w tym przypadku każdy kontroler widoku, który wypychasz do kontrolera nawigacji, powinien skonfigurować własny element nawigacyjny (który obejmuje ustawienie rightBarButtonItem we własnym NavigationItem własność).
Wasilij Kułakow
Dla obecnych czytelników nie sądzę, aby był jakikolwiek powód, aby dzwonić [rightbutton release]pod ARC (którego nie było w momencie, gdy ten komentarz był pierwotnie pisany).
karbokacja
20

Powyższe odpowiedzi są dobre, ale chciałbym je rozwinąć kilkoma dodatkowymi wskazówkami:

Jeśli chcesz zmodyfikować tytuł przycisku wstecz (strzałka-y patrząc po lewej stronie paska nawigacji), MUSISZ zrobić to w kontrolerze widoku POPRZEDNI, a nie w tym, dla którego będzie wyświetlany. To tak, jakby powiedzieć „hej, jeśli kiedykolwiek wrzucisz inny kontroler widoku na ten, wywołaj przycisk Wstecz„ Wstecz ”(lub cokolwiek innego) zamiast domyślnego”.

Jeśli chcesz ukryć przycisk Wstecz w specjalnym stanie, na przykład podczas wyświetlania UIPickerView, użyj self.navigationItem.hidesBackButton = YES;i pamiętaj, aby ustawić go z powrotem po opuszczeniu specjalnego stanu.

Jeśli chcesz wyświetlić jeden ze specjalnych przycisków symbolicznych, użyj formularza initWithBarButtonSystemItem:target:actionz wartością taką jakUIBarButtonSystemItemAdd

Pamiętaj, znaczenie tego symbolu zależy od Ciebie, ale uważaj na Wytyczne dotyczące interfejsu ludzkiego. Użycie UIBarButtonSystemItemAdd oznacza, że ​​usunięcie elementu prawdopodobnie spowoduje odrzucenie aplikacji.

Amagrammer
źródło
11

Dodanie przycisku niestandardowego do paska nawigacji (z obrazem dla buttonItem i określeniem metody akcji (void) openView {} i).

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 32, 32);
[button setImage:[UIImage imageNamed:@"settings_b.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openView) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc] init];
[barButton setCustomView:button];
self.navigationItem.rightBarButtonItem=barButton;

[button release];
[barButton release];
Oleh Kudinov
źródło
7

Poniższy przykład wyświetli przycisk z tytułem „Kontakt” na pasku nawigacji po prawej stronie. Jego akcja wywołuje metodę o nazwie „contact” z kontrolera widoku. Bez tej linii prawy przycisk nie jest widoczny.

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Contact"
                                                                          style:UIBarButtonItemStylePlain target:self action:@selector(contact:)];;

wprowadź opis obrazu tutaj

Tibidabo
źródło
3

W Swift 2 zrobiłbyś:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

(Nie jest to duża zmiana) W Swift 4/5 będzie to:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton
NRR
źródło
2

Dlaczego nie użyć następujących: (z Rysuj niestandardowy przycisk Wstecz na pasku nawigacyjnym iPhone'a )

// Add left
UINavigationItem *previousItem = [[UINavigationItem alloc] initWithTitle:@"Back title"];
UINavigationItem *currentItem = [[UINavigationItem alloc] initWithTitle:@"Main Title"];
[self.navigationController.navigationBar setItems:[NSArray arrayWithObjects:previousItem, currentItem, nil] animated:YES];

// set the delegate to self
[self.navigationController.navigationBar setDelegate:self];
Joe
źródło
0

szybki 3

    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(cancelPressed(_:)))
    cancelBarButton.setTitleTextAttributes( [NSFontAttributeName : UIFont.cancelBarButtonFont(),
                                                          NSForegroundColorAttributeName : UIColor.white], for: .normal)
    self.navigationItem.leftBarButtonItem = cancelBarButton


    func cancelPressed(_ sender: UIBarButtonItem ) {
        self.dismiss(animated: true, completion: nil)
    }
Venky
źródło