Відповіді:
За цим посиланням :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Як сказав Тайлер у коментарях:
робити це не в контролері видимого перегляду, а в контролері перегляду, який ви побачите, якщо натиснути кнопку назад
release
UIBarButtonItem
UIBarButtonItemStyleBordered
виклик до ресурсу self.navigationItem.backBarButtonItem.style
. Документація: developer.apple.com/library/ios/documentation/uikit/reference/…
Ви можете встановити текст у програмі інтерфейсу:
Виберіть елемент навігації ViewController, до якого повернеться кнопка "Назад":
На інспекторі атрибутів панелі утиліт введіть свою мітку для кнопки "Назад":
Я віддаю перевагу такому підходу над встановленням заголовка в коді, як у прийнятій відповіді.
Також врахуйте, що вам потрібно зробити це в контролері подання на один рівень вгору стека. Іншими словами, робити це не в контролері видимого перегляду, а в контролері перегляду, який ви побачите, якщо натиснути кнопку назад.
- Тилер
Я використовую це:
// 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";
}
Я знайшов зручне рішення для цього, просто встановивши заголовок контролера перед тим, як натиснути інший контролер на стек, як це:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
Потім переконайтеся, що введено оригінальний заголовок у viewWillAppear
такий спосіб:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Це працює, оскільки поведінка за замовчуванням під UINavigationController
час побудови кнопки "назад" під час натискання полягає у використанні заголовка з попереднього контролера.
Заголовок кнопки "Назад" за замовчуванням відповідає заголовку попереднього перегляду, тому швидкий трюк, який я використовую, - це розмістити наступний код у файлі .m попереднього перегляду.
-(void)viewWillAppear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Back";
}
у своєму методі 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];
}
Додайте наступний код у viewDidLoad або loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
Я протестував це в iPhone та iPad з iOS 9
navigationController
та topItem
властивостей, наприклад:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Додавання до відповіді. Зауважте з документів 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];
Сподіваюся, це допомагає!
Я відкрив щось цікаве. Якщо ви підкласируєте метод 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
щось нерозумне), який може дати вам певна інформація про контролер перегляду, що надходить у комплект, щоб ви могли налаштувати текст кнопки "назад" для цього. Тепер текст кнопки "назад" береться за місце, яке несе відповідальність виключно. Я мушу визнати, що створення нової кнопки для зміни тексту відстійне, але о добре.
Хтось може придумати причину, чому б не зробити це так? По крайней мере, вам не доведеться поворушитися з заголовками виду контролера або пам’ятати, щоб створити нову кнопку назад, перш ніж натиснути на контролер перегляду на навігаційному контролері.
Відповідь Рейна працює добре.
Зауважте, що якщо натиснути більше одного контролера перегляду, для кожного з них з'явиться змінена назва кнопки "Назад", що може бути не тим, що вам потрібно.
У цьому випадку вам потрібно буде створювати користувальницький UIBarButtonItem кожного разу, коли ви натискаєте контролер перегляду.
Також переконайтеся, що ви зробите це перед натисканням контролера перегляду, інакше ви отримаєте іконку екрана, коли зміна заголовка.
Розширюючи пропозицію Обрі, ви можете це зробити в контролері дочірнього перегляду:
створити дві змінні для зберігання старих значень батьківського 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
Це не ідеально. Ви побачите зміну заголовка батьківського подання під час анімації нового контролера. Але це досягає мети - спеціальне маркування задньої кнопки та збереження її у вигляді стандартної кнопки "назад".
Покладіть це на себе viewDidLoad
, сподівайтеся, що це призведе до того, що ви шукаєте
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
якщо ви хочете встановити заголовок в контролері 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 в розширення контролера.
Я знаю, що це старе питання, і відповіді вигляд оновлені!
Найпростіший спосіб - це зробити в батьківському ViewController:
тобто той, який переведе вас до наступного контролера перегляду.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
Зробивши це в коді, видаліть стиль кнопки "назад" UINavigationConroller
. Якщо ви додасте елемент навігації у кожному з ваших представлень, ви можете встановити заголовок зворотного ботону в полі StoryBoard
.
self.navigationController.navigationBar.topItem.title = @"Custom text";