Ответы:
По этой ссылке :
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, к которому вернется кнопка «Назад»:
В инспекторе атрибутов панели утилит введите свой ярлык для кнопки «Назад»:
Я предпочел бы этот подход, чем устанавливать заголовок в коде, как в принятом ответе.
Также обратите внимание, что вам нужно сделать это в контроллере представления на один уровень вверх по стеку. Другими словами, не делайте этого в видимом контроллере представления, но в контроллере представления, который вы увидите, если нажмете кнопку возврата.
--Tyler
Я использую это:
// 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;
}
затем добавьте простой метод, чтобы разрешить отклонение viewcontroller:
-(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
что нажимается вашим навигационным контроллером, будет автоматически нажата кнопка «Назад». Если вы хотите изменить текст для определенных контроллеров представления, вы можете попробовать и, возможно, привести viewcontroller к определенному классу или вашему собственному пользовательскому протоколу (который наследует ваш viewcontroller, от которого может быть подобный метод backButtonText
или что-то глупое), который может дать вам определенная информация о контроллере представления, которая поступает так, что вы можете настроить для нее текст кнопки «назад». Теперь текст кнопки «Назад» обрабатывается в месте, которое должно нести ответственность. Я должен признать, что создание новой кнопки для изменения текста отстой, ну да ладно.
Может кто-нибудь придумать причину, почему бы не сделать это так? По крайней мере, вам не нужно возиться с названиями viewcontroller или не забывать создавать новую кнопку назад, прежде чем нажимать viewcontroller на контроллере навигации.
Ответ Рейна работает хорошо.
Обратите внимание, что если вы нажмете более одного контроллера вида, для каждого из них появится измененный заголовок кнопки «Назад», который может не соответствовать вашему желанию.
В этом случае вам нужно будет создавать пользовательский UIBarButtonItem каждый раз, когда вы нажимаете контроллер представления.
Кроме того, убедитесь, что вы делаете это, прежде чем нажимать контроллер представления, в противном случае вы получите сбой экрана при изменении названия.
Разобравшись с предложением Обри, вы можете сделать это в контроллере дочернего представления:
создать две переменные для хранения старых значений родительского файла 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
Это не идеально. Вы увидите, как изменяется название родительского представления, когда новый контроллер анимирован. НО это действительно позволяет создать специальную метку для кнопки «Назад» и сохранить ее форму в виде стандартной кнопки «Назад».
Поместите это в себя 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";