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

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

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

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

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

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

Спасибо.

Ответы [ 36 ]

341 голосов
/ 19 сентября 2009

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

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
95 голосов
/ 19 февраля 2013

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

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

Работает и в Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
81 голосов
/ 14 июня 2012

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

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

View Controller 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 будет иметь title "Short" .

56 голосов
/ 10 декабря 2012

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

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

enter image description here

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

42 голосов
/ 02 апреля 2014

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

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

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

26 голосов
/ 21 октября 2009

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

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

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

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

19 голосов
/ 22 августа 2014

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

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

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

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

18 голосов
/ 20 июня 2013

Эта работа лучше для меня. Попробуйте:

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
17 голосов
/ 20 сентября 2009

Хорошо, вот способ. Если у вас есть контроллер вида «первый» и вы перемещаетесь по другому контроллеру вида «второй», нажимая кнопку или т. Д., Вам нужно проделать некоторую работу. Сначала вам нужно создать 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];
}

Вот и все.

15 голосов
/ 20 января 2016

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

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

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

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

navigation item

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

navigation item in View Hierarchy

add a space character to the Back Button field

  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 заголовками.

...