"Кнопка назад" UINavigationController
по умолчанию показывает заголовок последнего представления в стеке. Есть ли способ иметь собственный текст вместо кнопки "Назад"?
Пользовательский текст UINavigationController "назад"?
Ответ 1
От эта ссылка:
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Как сказал Тайлер в комментариях:
не делать этого в контроллере видимого вида, но в представлении контроллер, который вы увидите, если вы нажмете кнопку "Назад"
Ответ 2
Вы можете установить текст в построителе интерфейса:
Выберите элемент навигации ViewController, на который будет возвращена кнопка возврата:
В инспекторе атрибутов панели утилит введите свой ярлык для кнопки "Назад":
Я бы предпочел этот подход, установив заголовок в коде, как в принятом ответе.
Также обратите внимание: вам нужно сделать это в контроллере представления на один уровень вверх стек. Другими словами, не делайте этого в контроллере видимого вида, но в контроллере просмотра, который вы увидите, если вы нажмете кнопку "Назад".
- Тайлер
Ответ 3
Я использую это:
// 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";
}
Ответ 4
Я нашел удобное решение для этого, просто установив заголовок контроллера, прежде чем нажимать другой контроллер на стек, например:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
Затем обязательно установите исходное название в viewWillAppear
, например:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Это работает, потому что поведение по умолчанию UINavigationController
при построении кнопки "Назад" во время операции push заключается в использовании заголовка из предыдущего контроллера.
Ответ 5
Название кнопки "Назад" по умолчанию соответствует предыдущему типу заголовка, поэтому я использую быстрый трюк, чтобы поместить следующий код в предыдущий файл вида .m.
-(void)viewWillAppear:(BOOL)animated {
// Set title
[email protected]"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
[email protected]"Back";
}
Ответ 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];
}
Ответ 7
Добавьте следующий код в viewDidLoad или loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
Я тестировал его на iPhone и iPad с iOS 9
Ответ 8
Добавление для ответа на ответ. Обратите внимание, что объявления Apple, что объявление backBarButtonItem:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
Следовательно, ответ на ответ будет утечка памяти, потому что синтезированный сеттер будет 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];
Надеюсь, это поможет!
Ответ 9
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
}
Ответ 10
Я обнаружил что-то интересное.
Если вы подклассифицируете 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
, которые нажаты на ваш навигационный контроллер, автоматически будет нажата кнопка "Назад". Если вы хотите изменить текст для определенных контроллеров представлений, вы можете попробовать и, возможно, включить диспетчер представлений в определенный класс или собственный собственный протокол (который наследует ваш viewcontroller, у которого может быть такой метод, как backButtonText
или что-то глупое), которое может предоставить вам определенную информацию о viewcontroller, который поступает так, что вы можете настроить текст кнопки назад для него. Теперь текст обратной кнопки позаботится о месте, которое должно нести ответственность исключительно. Я должен признать, что создание новой кнопки для изменения текста отстой, но о хорошо.
Может ли кто-нибудь подумать о причине, почему бы не сделать это так? По крайней мере, вам не нужно возиться с заголовками viewcontroller или не задумываться о создании новой кнопки возврата, прежде чем нажать диспетчер просмотра на навигационном контроллере.
Ответ 11
Расширяясь по предложению Обри, вы можете сделать это в контроллере дочернего представления:
создайте две переменные для хранения старых значений родительского элемента navigationItem.title и родительского элемента навигации
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
Это не идеально. Вы увидите название изменения родительского представления, когда новый контроллер будет анимирован. НО это достигает цели пользовательской маркировки кнопки "Назад" и сохранения ее в форме стандартной кнопки "Назад".
Ответ 12
Ответ на ответ хорошо работает.
Обратите внимание, что если вы нажмете несколько контроллеров представления, заголовок с измененной кнопкой будет отображаться для каждого из них, что может быть не таким, каким вы хотите.
В этом случае вам нужно создать пользовательский UIBarButtonItem каждый раз, когда вы нажимаете контроллер вида.
Кроме того, убедитесь, что вы делаете это, прежде чем нажимать контроллер просмотра, иначе вы получите экран с икотой по мере изменения названия.
Ответ 13
Поместите это в вас viewDidLoad
, надейтесь, что это приведет к тому, что вы ищете
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
Ответ 14
если вы хотите установить заголовок в контроллере ARRIVING (иногда больше логики..) в быстрых 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 в расширение контроллера.
Ответ 15
Я знаю, что это старый вопрос, и ответы вроде как обновлены!
Самый простой способ сделать это в родительском ViewController:
то есть тот, который ведет вас к следующему представлению контроллера.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
Ответ 16
Выполняя это в коде, удалите стиль кнопки "Назад" UINavigationConroller
. Если вы добавите элемент навигации в каждое из своих представлений, вы можете установить заголовок back botton в StoryBoard
.