Как изменить название кнопки «назад» на панели навигации - PullRequest
219 голосов
/ 19 сентября 2009

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

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

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

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

Что мне делать?

Спасибо.

Ответы [ 36 ]

10 голосов
/ 06 ноября 2012

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

7 голосов
/ 27 ноября 2015

Swift версия:

У вашего ребенка ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
6 голосов
/ 20 сентября 2009

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

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

- (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 указывает на родительский контроллер представления, и я могу правильно вызывать родительские методы с этой ссылкой.

5 голосов
/ 05 сентября 2012
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
5 голосов
/ 22 апреля 2013

Вот ответ:

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

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

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

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

5 голосов
/ 17 июня 2015

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

self.title = @"";

Таким образом, при представлении новой сцены задний текст не появляется.

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

5 голосов
/ 19 ноября 2015

Для Свифта:

    // 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
5 голосов
/ 14 февраля 2012

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

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

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

Mine - контроллер приглашающего покупателя

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

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

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

Я поместил этот код в начало файла контроллера (.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-запросом.

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

4 голосов
/ 21 ноября 2011

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

Как это:

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.

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

4 голосов
/ 06 сентября 2011

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

А в Свифте:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
...