Как изменить заголовок кнопки "Назад" на панели навигации

В настоящее время значение по умолчанию для кнопки левой панели - это заголовок представления, в котором загружено текущее, другими словами, представление, которое будет отображаться при нажатии кнопки (кнопка возврата).

Я хочу изменить текст, отображаемый на кнопке, на что-нибудь другое.

Я попытался поместить следующую строку кода в метод viewDidLoad контроллера представления, но, похоже, это не сработало.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

Что я должен делать?

Спасибо.


person Dale    schedule 19.09.2009    source источник
comment
Пожалуйста, проверьте решение для iOS 11+ - повторное создание кнопки возврата не требуется.   -  person Lal Krishna    schedule 24.01.2021


Ответы (36)


Это должно быть помещено в метод, который вызывает ViewController под названием «NewTitle». Прямо перед оператором push или popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
person Jordan    schedule 19.09.2009
comment
Находясь в контроллере дочернего представления, вызов этого из контроллера дочернего представления не будет работать. Вы должны вызвать это из родительского контроллера представления, находясь внутри контроллера дочернего представления. - person Alex Reynolds; 20.09.2009
comment
Тогда сделайте это ответом, потому что тот, который вы выбрали, технически неверен. - person Jordan; 20.09.2009
comment
Или в одной строке: self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: NSLocalizedString (@Back, @) style: UIBarButtonItemStyleBordered target: nil action: nil] autorelease]; Спасибо! - person Dimitris; 31.03.2010
comment
Чтобы изменить кнопку возврата для моего контроллера представления третьего уровня (второе нажатие), мне пришлось использовать следующую строку вместо приведенного выше ответа: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; Я делаю что-то неправильно? - person JonB; 25.04.2010
comment
Джордан говорит, что он [добавил] немного больше ясности относительно того, где разместить код. Вот еще большая ясность: поместите его в первый (он же родительский) контроллер, непосредственно перед вызовом для нажатия второго (он же дочерний) контроллер. - person benvolioT; 29.01.2011
comment
вы можете создать собственный BaseViewController и поместить его в -viewDidLoad: - person ArtFeel; 06.09.2013
comment
Необязательно делать это прямо перед нажатием или толчком. Вы можете сделать это в viewDidLoad или loadView или где-нибудь еще, где вы установите заголовок и другие свойства для этого представления. Ответ Виктора Богдана ниже более понятен, ИМХО. - person Joe Strout; 05.12.2013
comment
Я использую это в iOS 8.4 и 9. Я делаю это непосредственно перед тем, как нажимаю новый контроллер представления (я делаю это через segue), и он прекрасно работает. - person Septronic; 09.12.2015
comment
Вышеупомянутое решение работает, за исключением того, что последняя строка в режиме ARC не требуется. 'release' недоступен в режиме автоматического подсчета ссылок. - person Ian Pinto; 16.02.2016
comment
Используйте UIBarButtonItemStylePlain, если минимальная цель развертывания - iOS7 или новее. UIBarButtonItemStyleBordered устарел. - person Kiryl Belasheuski; 15.03.2016

В ChildVC это сработало для меня ...

self.navigationController.navigationBar.topItem.title = @"Back";

Также работает в Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
person Peter Pan    schedule 19.02.2013
comment
Протестировано и подтверждено на iOS 7 в Xcode 5.0.2. Это БУДЕТ менять заголовок предыдущего экрана на Назад, когда вы к нему вернетесь. - person Alex Zavatone; 17.01.2014
comment
Самое простое решение. Работает как на iOS 6, так и на 7. Вставьте базовый UIViewController и готово. Намного лучше, чем решение IB или настройка в push vc. - person Eric Chen; 26.02.2014
comment
он меняет заголовок предыдущего контроллера представления, проблема в этом решении - person Nikita; 04.03.2014
comment
@Nikita, можно плитку вернуть обратно в вид исчезнет - person Dan Beaulieu; 19.10.2015

Вот документация для backBarButtonItem:

"Когда этот элемент навигации находится непосредственно под верхним элементом в стеке, контроллер навигации извлекает кнопку возврата для панели навигации из этого элемента навигации. [...] Если вы хотите указать собственное изображение или заголовок для кнопки возврата , вместо этого вы можете назначить этому свойству элемент настраиваемой кнопки панели (с настраиваемым заголовком или изображением) ".

Контроллер представления A ("родительский" контроллер представления):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Когда любой другой контроллер представления B находится наверху стека навигации, а A находится прямо под ним, кнопка возврата B будет иметь заголовок "Краткое".

person Victor Bogdan    schedule 14.06.2012
comment
сложная часть заключается в том, что вам нужно установить кнопку возврата в контроллере представления PARENT, а не в дочернем представлении. Потраченный впустую час просто понял это. - person Merkurial; 13.05.2016

в Xcode 4.5 с использованием раскадровки, безусловно, самое простое решение, которое я нашел, когда значение кнопки «Назад» не должно изменяться динамически, - это использовать поле «Кнопка возврата», связанное с элементом навигации контроллера представления, к которому вы хочу, чтобы кнопка «Назад» говорила что-то еще.

например на скриншоте ниже я хочу, чтобы кнопка "Назад" для контроллера (ов) представления, который я нажимаю, имела "Назад" в качестве заголовка кнопки "Назад".

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

конечно, это не сработает, если вам нужно, чтобы кнопка «Назад» каждый раз говорила что-то немного другое… для этого есть все другие решения.

person john.k.doe    schedule 10.12.2012
comment
В исходном вопросе ничего не говорилось об использовании раскадровок, поэтому определенно хорошо, что это не принятый ответ, однако правильное решение для разработки на основе раскадровки. - person villapossu; 29.04.2018

Я знаю, вопрос очень старый, но я нашел хорошее решение.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Работает с childView! Протестировано с iOS 7.

person seniorbenelli    schedule 02.04.2014
comment
Кажется, это работает только на одном уровне. Для меня это не работает для ребенка или ребенка. iOS 8. - person narco; 17.07.2015

Может быть, я слишком упрощаюсь, но из документации Apple формулировка такая:

Если элемент настраиваемой кнопки панели не указан ни одним из контроллеров представления, используется кнопка возврата по умолчанию, а ее заголовок устанавливается равным значению свойства title элемента предыдущий контроллер представления, то есть контроллер представления на один уровень ниже в стеке.

Решение, помеченное выше как правильное, устанавливает элемент кнопки по умолчанию из родительского контроллера. Это правильный ответ, но я решаю проблему, изменяя свойство self.title UIViewController прямо перед тем, как поместить новый контроллер в стек NavigationController.

Это автоматически обновляет заголовок кнопки «Назад» на следующем контроллере, и пока вы устанавливаете self.title обратно на то, что должно быть в viewWillAppear, я не вижу, что этот метод вызывает слишком много проблем.

person Jessedc    schedule 21.10.2009

Это работает лучше для меня. Пытаться :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
person Felipe FMMobile    schedule 20.06.2013

В Swift / iOS8 у меня работало следующее:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Портировано из ответа Фелипе.

person Duncan Smith    schedule 22.08.2014
comment
синтаксис swift 1.1: self.navigationController?.navigationBar.topItem?.backBarButtonItem - person Warren Burton; 26.10.2014
comment
Стиль должен быть UIBarButtonItemStyle.Plain. - person Micro; 08.06.2016
comment
Спасибо за это. Какой поистине жалкий API. И вообще представитель UIKit. Между панелями навигации и панелями состояния в iOS - чудо, которое мы до сих пор разрабатываем для этой проклятой платформы. Спасибо, baby jesus, за Stack Overflow и его участников! - person Womble; 17.10.2016
comment
@Wobmle: Вам стоит разрабатывать под Android несколько месяцев;) - person heyfrank; 13.07.2018

Хорошо, вот способ. Если у вас есть контроллер представления «первый», а вы перемещаетесь по другому контроллеру представления «вторым», нажимая кнопку или т. Д., Вам необходимо проделать некоторую работу. Сначала вам нужно создать BarButtonItem в методе ViewDidLoad «второго» контроллера представления, как это;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

После того, как вы это сделаете, вам нужно написать код для действия «btnBack» в том же файле .m, как этот;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

Это все.

person EEE    schedule 19.09.2009
comment
leftBarButtonItem не имеет вида backBarButtonItem, если это важно в дизайне приложения. - person Alex Reynolds; 20.09.2009
comment
Из опубликованных решений (большое спасибо) это, похоже, работает, хотя, как Алекс сказал выше, кнопка левой панели не выглядит как элемент задней панели. Как я могу сделать так, чтобы он выглядел как элемент на задней перекладине ??? - person Dale; 20.09.2009

У меня был родительский контроллер представления с очень длинным заголовком. Это привело к тому, что текст кнопки «Назад» залил заголовок дочернего контроллера представления.

Попробовав кучу разных решений, я в итоге сделал вот что (расширяя подход @ john.k.doe):

Использование Xcode 7.2, Swift 2

  1. В Storyboard добавьте Navigation Item в сцену Parent View Controller (не дочерний VC).

элемент навигации

  1. На Attributes Inspector вашего нового Navigation Item введите символ space в поле Back Button. Подробнее об этом позже.

элемент навигации в представлении  Иерархия

добавить пробел  в поле кнопки

  1. В контроллере представления Parent добавьте следующий код:

фрагмент:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Объяснение:

Кнопка возврата принадлежит родительскому контроллеру представления. Navigation Item дает вам указатель на кнопку возврата, поэтому вы можете установить заголовок в коде или в раскадровке.

Примечание.

Если вы оставите текст Navigation Item Back Button пустой строкой по умолчанию, заголовок кнопки «Назад» станет «Назад».

Другие подходы работают, зачем использовать этот?

Хотя можно переопределить заголовок кнопки «Назад» на контроллере дочернего представления, было сложно получить его дескриптор, пока он уже не мигнул на короткое время на экране.

Некоторые из подходов создают новую кнопку возврата и заменяют существующую. Я уверен, что это работает и, вероятно, необходимо в некоторых случаях использования. Но я предпочитаю использовать существующие API, когда это возможно.

Изменение title контроллера родительского представления - самое быстрое решение в некоторых ситуациях. Однако это изменяет родительский заголовок, поэтому вам нужно управлять состоянием. Кроме того, с Tab Bar Controller дела обстоят беспорядочно, потому что изменение заголовка вызывает побочные эффекты с Tab Bar Item заголовками.

person Robert Chen    schedule 20.01.2016

Для тех, кто использует раскадровки, просто выберите родительский (а не тот, который содержит целевое представление) фрейм контроллера представления (обязательно щелкните правой кнопкой мыши на панели навигации, затем откройте инспектор атрибутов, где вы найдете три входа формы. Третий " кнопка "назад" - это то, что мы ищем.

person pedrouan    schedule 05.11.2012
comment
это лучшее решение, если вас не волнует локализация. - person MiQUEL; 25.05.2013

Быстрая версия:

В вашем дочернем ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
person buxik    schedule 27.11.2015
comment
это фактически изменит заголовок предыдущего контроллера представления в стеке на TEXT, что далеко не идеально. - person gravitron; 31.05.2016

Вот еще один способ сделать это.

В родительском контроллере представления реализуйте следующий метод:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

В контроллере дочернего представления, когда вы хотите изменить заголовок, это будет работать:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Мне так и не удалось заставить работать свойство parentViewController:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Я не знаю, ошибка ли это или я не использую ее должным образом. Но захват предпоследнего контроллера представления в массиве viewControllers указывает на родительский контроллер представления, и я могу правильно вызывать родительские методы с этой ссылкой.

person Alex Reynolds    schedule 19.09.2009

Ok. Я лично ненавидел все эти варианты. Поэтому я придумал свою.

Основываясь на информации, которую я видел. Похоже, что предыдущий контроллер представления контролирует свою собственную кнопку «Назад», которая будет представлена ​​на перемещаемом контроллере представления.

Я создал метод отложенной загрузки для элемента навигации на контроллере, который хочет изменить кнопку «Назад».

Моя - это контроллер приглашения покупателя

Пригласить покупателя - это текст, установленный по умолчанию.

но кнопка "Назад" должна быть "Пригласить"

Вот код, который я использовал для создания кнопки возврата.

Я поместил этот код в верхнюю часть файла реализации контроллера (.m), и он автоматически переопределил метод super.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Я считаю, что это гораздо более элегантный способ добиться этого.

Я помещаю этот код в одно место, и он автоматически заполняется при необходимости.

Нет необходимости вызывать код перед каждым push-запросом.

Надеюсь это поможет

person The Lazy Coder    schedule 14.02.2012

Для Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
person Ryan R    schedule 19.11.2015

Вот ответ:

В viewDidAppear:animated (НЕ в viewDidLoad) выполните следующие действия.

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Это если вы хотите сохранить форму кнопки возврата.

person Basheer_CAD    schedule 22.04.2013
comment
Неплохо, за исключением того, что они могут видеть, как меняются названия. Я пробовал использовать viewWillAppear, но он не работает. - person Travis M.; 13.06.2014

Ни одно из описанных здесь решений не помогло мне. Я удалил заголовок со сцены, откуда я пришел, следующим образом:

self.title = @"";

Поэтому, когда отображается новая сцена, задний текст не появляется.

Я абсолютно согласен с тем, что это не совсем ясное решение, но оно сработало, и ни одно из объяснений не помогло мне.

person Javier Calatrava Llavería    schedule 17.06.2015
comment
Чувак, я должен сказать вам, что сейчас 2017 год, и все еще сложно удерживать кнопку возврата. Ваш метод сработал для меня, и я получил знак ‹, хотя я хотел слово« Отмена », но я соглашусь на то, что получил. :) - person AnBisw; 22.11.2017

Я обнаружил, что лучше всего изменить заголовок текущего контроллера представления в стеке навигации на желаемый текст кнопки «Назад», прежде чем переходить к следующему контроллеру представления.

Например

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Затем в viewDidAppear установите заголовок обратно на желаемый заголовок для исходного ВК. Вуаля!

person OneInABajilian    schedule 11.08.2015

Я обнаружил, что самый простой способ изменить имя кнопки возврата - это установить заголовок контроллера представления на заголовок кнопки возврата, а затем заменить titleView в элементе навигации контроллеров представления на настраиваемую метку с его реальным имя.

Нравится:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

Это заставит ваш заголовок в UINavigationBar выглядеть так, как будто он был родным. Предоставление контроллеру представления возможности разделить заголовок и заголовок кнопки возврата.

В случае контроллеров представления A и B, A отвечает за то, как должна выглядеть кнопка возврата, в то время как B отображается.

РЕДАКТИРОВАТЬ: это также поддерживает собственный внешний вид кнопки возврата (элемент кнопки со стрелкой влево).

person Trenskow    schedule 21.11.2011

Этот код тоже работает. Поместите это в корневой контроллер контроллера навигации:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
person user2666203    schedule 15.03.2015

Я новичок в iOS, но дам свой очень простой ответ по переопределению класса контроллера навигации. Я просто переопределил методы push и pop и сохранил заголовок предыдущего контроллера представления. Извините за вставку в блок js. Немного запутался, как его вставить в обычный блок кода.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

person Sergey Brazhnik    schedule 13.10.2016

self.navigationController.navigationBar.backItem.title = @"TEXT";

А в Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
person Onnmir    schedule 06.09.2011

self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

вы можете поместить его в любое место в коде контроллера parrent, что позволяет вам иметь разные кнопки возврата для разных дочерних представлений.

person chikuba    schedule 31.08.2011

Большинство решений убивает оригинальный стиль BackButton (кнопка с левой стрелкой) при добавлении обычной кнопки с желаемым заголовком.
Итак, чтобы сохранить исходный стиль, есть 2 способа:
1-й: использовать недокументированный стиль кнопки ( 110 или что-то в этом роде), чего я предпочитаю не делать. Но если вы хотите, вы можете найти, как это сделать здесь, в stackoverflow.
2-й: Использовать идею Trenskow. Мне он понравился, и я его немного изменил.
Вместо переопределения - (NSString *) title я решил сохранить исходный заголовок следующим образом (что позволяет мне использовать заголовки пера, а также заданный заголовок в нажмите состояние кстати).

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

Это решение работает хорошо и выглядит нативно. Также, если использовать его в методе viewDidLoad, он предотвращает выполнение более одного раза.
Также я пробовал решение Jessedc, но оно выглядит плохо. Это приводит к изменению видимой для пользователя строки заголовка на лету с исходного на желаемый BackButton и обратно.

person Stan    schedule 02.04.2012

Для меня это работает как «упрощенная» версия ранее опубликованных ответов.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Не забудьте поместить код в родительский контроллер представления (например, представление, в котором есть ваше табличное представление или UITableViewController), не дочернее или подробное представление (например, UIViewController).

Вы можете легко локализовать строку кнопки возврата следующим образом:

backButton.title = NSLocalizedString(@"Back Title", nil);
person Lex L.    schedule 23.02.2014

Согласно документу из _1 _> _ 2_

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

Если свойство leftBarButtonItem самого верхнего элемента навигации равно нулю, на панели навигации отображается кнопка «Назад», заголовок которой является производным от элемента в этом свойстве.

Но установка backItem.backBarButtonItem не работает при первом просмотреWillAppear. Установка topItem.backBarButtonItem работает только при первом просмотреWillAppear. Потому что navigationBar.topItem все еще указывает на previousViewController.navigationItem. В viewWillLayoutSubviews обновляются topItem и backItem. Итак, после первого раза viewWillAppear, мы должны установить backItem.backBarButtonItem.

ОТВЕТ: установка backBarButtonItem на navigationItem предыдущего viewController независимо от того, когда и где в вашем текущем viewController (верхнем viewController). Вы можете использовать этот код в viewWillAppear или viewDidLoad. Проверьте мое сообщение в блоге Установить панель навигации iOS Заголовок кнопки "Назад" для подробного анализа.

 NSArray *viewControllerArray = [self.navigationController viewControllers];
    // get index of the previous ViewContoller
    long previousIndex = [viewControllerArray indexOfObject:self] - 1;
    if (previousIndex >= 0) {
        UIViewController *previous = [viewControllerArray objectAtIndex:previousIndex];
        previous.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
                                                         initWithTitle:backButtonTitle
                                                         style:UIBarButtonItemStylePlain
                                                         target:self
                                                         action:nil];
    }
person situee    schedule 22.08.2014
comment
Согласно вашему сообщению в блоге: переопределить func viewWillLayoutSubviews () {super.viewWillLayoutSubviews () let customBackButton = UIBarButtonItem (title: BackTitle, style: .bordered, target: nil, action: nil) self.navigationController? .NavigationBartemback.backItem? .NavigationBartemback.backItem? = customBackButton} - person Illya Krit; 06.03.2018

У нас есть две венчурные компании A и B.

Если вы хотите изменить заголовок в B, напишите этот код в A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
person iOS    schedule 16.02.2018

Ответ Стэна был лучшим. Но у него также есть проблема: когда вы используете контроллер с панелью вкладок и меняете заголовок контроллера, вы также можете изменить заголовок панели вкладок. Поэтому лучший ответ - изменить только view_controller.navigationItem.title и использовать view_controller.navigationItem .title в функции. Ответ здесь: (С помощью ARC и добавьте их в viewDidLoad представления)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

Сам я использую эту функцию, просто у меня есть функция с однострочным кодом в viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}
person jtianling    schedule 30.11.2012

Если вы хотите не только изменить текст кнопки «Назад» на тот же текст и сохранить исходную форму стрелки влево, но и сделать что-то, когда пользователь нажимает кнопку «Назад», я рекомендую вам взглянуть на мой "CustomNavigationController ".

person jianpx    schedule 31.12.2013

ПРОБЛЕМА: текст «Назад» в панели навигации нельзя заменить.

ПРИЧИНА: метка «Назад» устанавливается на панели навигации после нажатия представления, потому что атрибут .title в родительском контроллере представления был установлен на ноль (или не инициализирован).

ОДНО РЕШЕНИЕ: Если вы установите self.title = "Whatever ...", вы увидите, что вместо "Back" появится "Whatever ..." после нажатия нового контроллера представления.

person Javier Calatrava Llavería    schedule 03.04.2015

Используйте следующую строку кода:

UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"hello"
                                 style:UIBarButtonItemStylePlain
                                target:nil
                                action:nil];

self.navigationItem.leftBarButtonItems =[[NSArray alloc] initWithObjects:newBackButton, nil];

self.navigationItem.leftItemsSupplementBackButton = YES;
person Payal Maniyar    schedule 30.03.2016

Swift 4
iOS 11.2
Xcode 9.2

TableViewController1  ---segue--->   TableViewController2

Вы можете изменить текст кнопки «Назад» в TableViewController1 или TableViewController2.

Измените текст кнопки "Назад" внутри TableViewController1:

1) In viewWillAppear():

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let myBackButton = UIBarButtonItem()
    myBackButton.title = "Custom text"
    navigationItem.backBarButtonItem = myBackButton
}

По какой-то причине viewDidLoad () еще слишком рано для добавления кнопки возврата в NavigationItem. Чтобы соединить два TableViewController, в элементе управления раскадровкой перетащите из TableViewCell в TableViewController1 в середину TableViewController2 и во всплывающем меню выберите Selection Segue > Show.

2) In tableView(_:didSelectRowAt:):

override func tableView(_ tableView: UITableView, didSelectRowAt: IndexPath) {

    let myButton = UIBarButtonItem()
    myButton.title = "Custom text"
    navigationItem.backBarButtonItem = myButton

    performSegue(withIdentifier: "ShowMyCustomBackButton", sender: nil)
}

Чтобы соединить два TableViewController, в элементе управления раскадровкой перетащите из маленького желтого кружка над TableViewController1 в середину TableViewController2 и во всплывающем меню выберите Manual Segue > Show. Затем выберите сегмент, соединяющий два TableViewController, и в инспекторе атрибутов рядом с «Идентификатором» введите «ShowMyCustomBackButton».

3) В storyboard:

Если вам просто нужен статический настраиваемый текст для кнопки возврата, выберите NavigationItem для TableViewController1 (у него есть < для значка в оглавлении раскадровки), затем откройте инспектор атрибутов и в поле «Кнопка возврата» введите свой собственный текст. (не забудьте выйти из этого поля, чтобы изменения вступили в силу).


Измените текст кнопки "Назад" внутри TableViewController2:

1) In viewWillAppear():

class MySecondTableViewController: UITableViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let myBackButton = UIBarButtonItem(
            title: "<Custom text",
            style: .plain,
            target: self,
            action: #selector(goBack)  //selector() needs to be paired with an @objc label on the method
        )

        navigationItem.leftBarButtonItem = myBackButton
    }

    @objc func goBack() {
        navigationController?.popViewController(animated: true)
    }

Чтобы соединить два TableViewController, в элементе управления раскадровкой перетащите из TableViewCell в TableViewController1 в середину TableViewController2 и во всплывающем меню выберите Selection Segue > Show.

person 7stud    schedule 02.02.2018

Если у вас более одной навигации,

ParentViewController -> ChildViewController1 -> ChildViewController2

вы можете использовать приведенный ниже код, чтобы изменить заголовок кнопки возврата на панели навигации.

self.navigationController? .navigationBar.topItem? .backBarButtonItem = UIBarButtonItem.init (заголовок: «Назад», стиль: .plain, цель: ноль, действие: ноль)

person Rizwan Shaikh    schedule 25.05.2019

Похоже, что контроллер навигации ищет

previousViewController.navigationItem.title

Если ничего там не ищет

previousViewController.title
person Basem Saadawy    schedule 05.04.2014

У меня это работает в Swift 4 и iOS 11. Чаще всего мне нужно это делать, когда пользователь нажимает на строку в табличном представлении и новый контроллер представления помещается в стек навигации. Обычно я хочу, чтобы кнопка «Назад» была именем или каким-либо атрибутом объекта, представленного строкой, по которой была нажата кнопка. Обычно я делаю это в didSelectRowAt... вот так:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let object = // get the object this row represents

    let backButton = UIBarButtonItem()
    backButton.title = object.name // or whatever
    self.navigationItem.backBarButtonItem = backButton

    // now show or segue to the next view controller
}
person Murray Sagal    schedule 28.10.2017

Решение iOS 11+ - не требует повторного создания кнопки возврата.

Установите backButtonTitle как пробел на предыдущем экране.

// If navigation is from A -> B, set in A's `viewDidLoad`.
navigationItem.backButtonTitle = " "
person Lal Krishna    schedule 15.01.2021