Як додати кнопку до 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?
аневризм

Змінна смужка у відповіді - це будь-яка панель навігації, яка не керується навігаційним контролером. Якщо у вас є контролер навігації, у нього є власна панель навігації, якою він керує - у цьому випадку кожен контролер перегляду, який ви натискаєте на контролер навігації, повинен налаштувати свій власний елемент навігації (що включає встановлення rightBarButtonItem у власному навігаційномуItem майно).
Василь Кулаков

Для нинішніх читачів я не вірю, що є якісь підстави дзвонити [rightbutton release]в АРК (чого не було в той час, коли цей коментар був написаний спочатку).
карбокація

20

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

Якщо ви хочете змінити заголовок кнопки "Назад" (стрілка-y дивиться на ліворуч від панелі навігації), ОБОВ'ЯЗКОВО це зробити в попередньому контролері перегляду, а не в тому, для якого воно відображатиметься. Це як сказати "ей, якщо ви коли-небудь натисніть інший контролер перегляду поверх цього, зателефонуйте кнопку" Назад "(або що завгодно) замість типового".

Якщо ви хочете приховати кнопку повернення під час спеціального стану, наприклад, під час відображення UIPickerView, використовуйте self.navigationItem.hidesBackButton = YES;та пам'ятайте, щоб повернути її, коли виходите із спеціального стану.

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

Пам’ятайте, значення цього символу залежить від вас, але будьте уважні до Інструкції щодо людського інтерфейсу. Використання UIBarButtonSystemItemAdd для означає видалення елемента, ймовірно, ваш додаток буде відхилено.


11

Додавання спеціальної кнопки до панелі навігації (із зображенням для buttonItem та вказівкою способу дії (недійсним) 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

У наведеному нижче прикладі буде відображатися кнопка з заголовком "Контакт" на навігаційній панелі праворуч. Його дія викликає метод, який називається "контактом" від контролера перегляду. Без цього рядка права кнопка не видно.

    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

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)
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.