Как добавить кнопку в UINavigationBar?

Ответы:

294

Пример кода для установки rightbuttonна 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];

Но обычно у вас есть NavigationController, позволяющий писать:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Мадс Мобек
источник
1
Я получаю предупреждение о стиле: параметр -> предупреждение: семантическая проблема: неявное преобразование из типа перечисления «UIBarButtonSystemItem» в другой тип перечисления «UIBarButtonItemStyle»
pojo
3
Это должно быть initWithBarButtonSystemItem: UIBarButtonSystemItemDone, чтобы избежать предупреждения.
JordanC
2
В этом примере я не понимаю, откуда взялась «полоса». Какое свойство верхней панели по умолчанию для UINavigationItem?
aneuryzm
Переменная bar в ответе - это любая панель навигации, не управляемая контроллером навигации. Если у вас есть контроллер навигации, у него есть собственная панель навигации, которой он управляет - в этом случае каждый контроллер представления, который вы нажимаете на контроллер навигации, должен настраивать свой собственный элемент навигации (который включает установку rightBarButtonItem в его собственном элементе навигации свойство).
Василий Кулаков
Для нынешних читателей я не верю, что есть какая-либо причина звонить [rightbutton release]по ARC (чего не было в то время, когда этот комментарий был изначально написан).
карбокатион
20

Вышеуказанные ответы хороши, но я хотел бы дополнить их еще несколькими советами:

Если вы хотите изменить заголовок кнопки «Назад» (стрелка y, указывающая слева от панели навигации), вы ДОЛЖНЫ сделать это в ПРЕДЫДУЩЕМ контроллере представления, а не в том, для которого он будет отображаться. Это как сказать «эй, если вы когда-нибудь нажмете другой контроллер представления поверх этого, вызовите кнопку« Назад »(или что-то еще) вместо кнопки по умолчанию».

Если вы хотите скрыть кнопку «Назад» во время особого состояния, например, когда отображается UIPickerView, используйте self.navigationItem.hidesBackButton = YES;и не забудьте установить ее обратно при выходе из особого состояния.

Если вы хотите отобразить одну из специальных символических кнопок, используйте форму initWithBarButtonSystemItem:target:actionсо значением вродеUIBarButtonSystemItemAdd

Помните, что значение этого символа зависит от вас, но будьте осторожны с Руководством по интерфейсу пользователя. Использование UIBarButtonSystemItemAdd для обозначения удаления элемента, вероятно, приведет к отклонению вашего приложения.

Amagrammer
источник
11

Добавление настраиваемой кнопки на панель навигации (с изображением для buttonItem и указанием метода действия (void) openView {} и).

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];
Олег Кудинов
источник
7

В приведенном ниже примере будет отображаться кнопка с заголовком «Контакт» на панели навигации справа. Его действие вызывает метод с именем «contact» из контроллера просмотра. Без этой строки правая кнопка не видна.

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

введите описание изображения здесь

Тибидабо
источник
3

В Swift 2 вы бы сделали:

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

(Несущественное изменение) В Swift 4/5 это будет:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton
NRR
источник
2

Почему бы не использовать следующее: (с помощью пользовательской кнопки «Назад» на панели навигации iPhone )

// 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];
Джо
источник
0

быстрый 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
источник