Спеціальний текст UINavigationController "кнопка" назад?


147

"Кнопка" назад UINavigationControllerза замовчуванням показує назву останнього перегляду в стеку. Чи є спосіб замість цього надати спеціальний текст у кнопці "Назад"?


1
Ця робота для менеself.navigationController.navigationBar.topItem.title = @"Custom text";
huync

Відповіді:


342

За цим посиланням :

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

Як сказав Тайлер у коментарях:

робити це не в контролері видимого перегляду, а в контролері перегляду, який ви побачите, якщо натиснути кнопку назад


4
Ви повинні . releaseUIBarButtonItem
Мехрдад Афшарі

217
Також врахуйте, що вам потрібно зробити це в контролері подання на один рівень вгору стека. Іншими словами, робити це не в контролері видимого перегляду, а в контролері перегляду, який ви побачите, якщо натиснути кнопку назад.
Тайлер

6
Просто для уточнення коментаря Тайлера, тому що я спочатку цього не зрозумів: Встановлення backBarButtonItem в контролерах перегляду вікна NaviItem встановлює кнопку, яка покаже, щоб отримати НАЗАД на цей контролер перегляду. Також зауважте, що хоча кнопки зі стрілкою не існує, ця кнопка все одно отримає стиль стрілки. Я використовував UIBarButtonItemStylePlain і все ще отримую стиль кнопки зі стрілками.
Джон Штейнмет

3
Пропозиція: Замість того, щоб припустити стиль, передайте заданий в даний час стиль. У цьому коді відповіді замініть UIBarButtonItemStyleBorderedвиклик до ресурсу self.navigationItem.backBarButtonItem.style. Документація: developer.apple.com/library/ios/documentation/uikit/reference/…
Василь Бурк

1
Зауважте, що в рамках ARC ви повинні вийти з виклику автоматичного виходу. значить, у вас є self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @ "Спеціальний заголовок" стиль: UIBarButtonItemStyleЗапорядкована мета: nil action: nil];
bkbeachlabs

43

Ви можете встановити текст у програмі інтерфейсу:

Виберіть елемент навігації ViewController, до якого повернеться кнопка "Назад":

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

На інспекторі атрибутів панелі утиліт введіть свою мітку для кнопки "Назад":

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

Я віддаю перевагу такому підходу над встановленням заголовка в коді, як у прийнятій відповіді.

Також врахуйте, що вам потрібно зробити це в контролері подання на один рівень вгору стека. Іншими словами, робити це не в контролері видимого перегляду, а в контролері перегляду, який ви побачите, якщо натиснути кнопку назад.
- Тилер


Це найкраща відповідь, яку я знайшов поки що.
Аян Сенгупта

2
Щоб було зрозуміло, це потрібно встановити на пункті навігації контролера перегляду, а не на інспекторі атрибутів контролера перегляду.
Патрік

Це найкраща відповідь, яку я знайшов.
bicepjai

Це найкраща відповідь
Алекс Браун

2
Як і в Xcode 6.1.1, і працює в iOS 7, схоже, що ваш попередній заголовок попереднього перегляду ВИНАГИ замінить будь-яку назву кнопки "Назад", яку ви тут встановили. Якщо заголовок попереднього перегляду містить більше, ніж обмежується 11 символів, тоді кнопка "Назад" наступного перегляду просто скаже "Назад". Нічого не обійти, окрім як створити новий елемент навігаційного рядка з нуля, як показано у відповіді, де голосується тут.
промінь

22

Я використовую це:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

Це майже працює для мене, але коли я натискаю кнопку "назад", текст повертається до назви батьків на час дії анімації :-(
Danny Tuppeny

3
Це змінює назву кнопки Назад контролера вгору в стеку. Це не змінює назву кнопки "Назад" поточного відображеного контролера. Ще гірше: він змінює назву контролера попереднього контролера!
левіафан

Як зазначають інші коментатори, цей метод трохи неспроможний. Я б не рекомендував робити це, оскільки це насправді не те, як API має намір використовувати його. Ви можете налаштувати себе на важкі помилки в майбутньому!
RickDT

11

Я знайшов зручне рішення для цього, просто встановивши заголовок контролера перед тим, як натиснути інший контролер на стек, як це:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Потім переконайтеся, що введено оригінальний заголовок у viewWillAppearтакий спосіб:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

Це працює, оскільки поведінка за замовчуванням під UINavigationControllerчас побудови кнопки "назад" під час натискання полягає у використанні заголовка з попереднього контролера.


1
Проблема в цьому полягає в тому, що заголовок змінюється на старому погляді, оскільки він оживляє і виглядає трохи неприємним. Жодне із наведених рішень тут, здається, не працює так, як вам хотілося :-(
Danny Tuppeny

1
Це ідеально в моїй ситуації, тому що я не показую NavBar на попередньому екрані, і я просто хочу видалити titleLabel із кнопки "Назад" на новому екрані та мати лише стрілку шеврону iOS7. Тому я можу просто встановити порожній літерал NSString для заголовка.
siburb

натискання контролера перегляду підвищує виняток при натисканні на спинку
Sumit

7

Заголовок кнопки "Назад" за замовчуванням відповідає заголовку попереднього перегляду, тому швидкий трюк, який я використовую, - це розмістити наступний код у файлі .m попереднього перегляду.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

Це працює досить добре для багатьох випадків, і це досить просто ... лише зауваження полягає в тому, що переосмислення будь-якого з цих методів вимагає, щоб реалізація супер була викликана в якийсь момент нового методу.
izk

2
За допомогою цього методу ви помітите, що заголовок батьківського подання буде змінено на "Назад", перш ніж відбудеться натискання анімації. (І сорт гадає, що якщо ви перейдете до методу viewDidDisappear, ви побачите, що комутатор відбувається після натискання.)
Джеймс Батчер

Я люблю цей метод, але проблема, з якою я стикаюся з цим, полягає в тому, що "Оригінальний заголовок" встановлюється добре, але він поставляється з еліпсісом, якщо він довший, ніж "Назад", що має бути, тому що подання ще не знаходиться в ієрархії перегляду. , він не відтворює перегляд заголовка. Проблема, описана вище @JamesBoutcher, для мене непомітна через швидку початкову швидкість анімації. Насправді я щойно зрозумів, що проблема, з якою я стикаюся, особливо помітна завдяки анімації, що закінчується повільно, яка виникає, коли ця проблема є помітною.
трсс

Хоча відповідь на сайті stackoverflow.com/questions/1441699/… вважається більшою, ніж необхідна настройка, це є документально підтвердженим способом і, що ще важливіше, здається, більше узгоджується з нашими намірами.
trss

6

у своєму методі init додайте наступний код:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

потім додайте простий метод, щоб дозволити звільнення контролера перегляду:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

3

Додайте наступний код у viewDidLoad або loadView

self.navigationController.navigationBar.topItem.title = @"Custom text";

Я протестував це в iPhone та iPad з iOS 9


Повинен бути self.navigationController? .NavigationBar.backItem? .Title = "Спеціальний текст"
Peacemoon

1
Єдиною різницею, яка мені потрібна, було необов’язкове прикування до navigationControllerта topItemвластивостей, наприклад:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel

2

Додавання до відповіді. Зауважте з документів Apple, що декларація backBarButtonItem така:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Отже, відповідь Rein просочить пам'ять, оскільки синтезований сеттер буде retainекземпляром, який ви передаєте, який ніколи не видається явно. Виправити це можна за допомогоюautorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Або ви можете вказати змінну на екземпляр, щоб потім явно випустити її пізніше:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

Сподіваюся, це допомагає!


Зауважте, що в наші дні з ARC вам не потрібно турбуватися про автовипуск (і справді компілятор помилиться, якщо ви спробуєте зробити автовипуск у проекті з підтримкою ARC)
Ерік Голдберг,

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

Я відкрив щось цікаве. Якщо ви підкласируєте метод UINavigationControllerі замініть pushViewController:animated:метод і зробите щось подібне: (майте на увазі, що я використовую ARC)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Тоді для всіх, ViewControllersщо натискаються на ваш навігаційний контролер, кнопка "Назад" у них буде автоматично. Якщо ви хочете змінити текст для певних контролерів перегляду, ви можете спробувати і, можливо, передати контролер перегляду до певного класу або власного користувальницького протоколу (який ваш спадковий контролер успадковує, від якого може бути такий метод, як backButtonTextщось нерозумне), який може дати вам певна інформація про контролер перегляду, що надходить у комплект, щоб ви могли налаштувати текст кнопки "назад" для цього. Тепер текст кнопки "назад" береться за місце, яке несе відповідальність виключно. Я мушу визнати, що створення нової кнопки для зміни тексту відстійне, але о добре.

Хтось може придумати причину, чому б не зробити це так? По крайней мере, вам не доведеться поворушитися з заголовками виду контролера або пам’ятати, щоб створити нову кнопку назад, перш ніж натиснути на контролер перегляду на навігаційному контролері.


0

Відповідь Рейна працює добре.

Зауважте, що якщо натиснути більше одного контролера перегляду, для кожного з них з'явиться змінена назва кнопки "Назад", що може бути не тим, що вам потрібно.

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

Також переконайтеся, що ви зробите це перед натисканням контролера перегляду, інакше ви отримаєте іконку екрана, коли зміна заголовка.


0

Розширюючи пропозицію Обрі, ви можете це зробити в контролері дочірнього перегляду:

створити дві змінні для зберігання старих значень батьківського navigationItem.title та батьківського NaviItem

UINavigationItem* oldItem;
NSString* oldTitle;

в viewDidLoad, додайте наступне:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

в viewWillDisappear, додайте наступне:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

Це не ідеально. Ви побачите зміну заголовка батьківського подання під час анімації нового контролера. Але це досягає мети - спеціальне маркування задньої кнопки та збереження її у вигляді стандартної кнопки "назад".


0

Покладіть це на себе viewDidLoad, сподівайтеся, що це призведе до того, що ви шукаєте

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

0

якщо ви хочете встановити заголовок в контролері ARRIVING (іноді більше логіки ..) в swift 3:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

у майбутньому контролері:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

як правило, я розміщую self.setBackButtonNavBar в розширення контролера.


0

Я знаю, що це старе питання, і відповіді вигляд оновлені!

Найпростіший спосіб - це зробити в батьківському ViewController:

тобто той, який переведе вас до наступного контролера перегляду.

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

-1

Зробивши це в коді, видаліть стиль кнопки "назад" UINavigationConroller. Якщо ви додасте елемент навігації у кожному з ваших представлень, ви можете встановити заголовок зворотного ботону в полі StoryBoard.

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