Как изменить текст на кнопке возврата

90

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

Я пробовал следующее, что не сработало:

self.navigationItem.leftBarButtonItem.title = @"Back";

Спасибо.

Илья Суздальницкий
источник
3
Имейте в виду, что кнопки назад имеют заголовки не просто так. Изменяя заголовок на «Назад», вы лишаете пользователя информации о том, к чему возвращается кнопка.
Саймон

Ответы:

167

Пытаться

self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil] autorelease];

Я обнаружил это, просмотрев документы backBarButtonItem в документации Apple для UINavigationItem .

Марк В
источник
1
Извините, у меня нет возможности проверить это прямо сейчас, но применяется ли при этом левая форма встроенных кнопок «Назад» или сохраняется прямоугольная форма UIBarButtonItem по умолчанию?
Марко,
На самом деле я не уверен. Я предполагаю, что он просто автоматически сохранит форму кнопки возврата, поскольку вы устанавливаете свойство backButton, но вам нужно будет проверить его, чтобы узнать. Мне тоже любопытно.
Marc W,
2
Да, сработало! Это да меняет название и да, сохраняет форму. Спасибо за помощь.
Илья Суздальницкий
1
Примечание: кнопка возврата сохраняется дважды [1x из выделения, 1x из сохранения свойства]. Однако, если вы не измените кнопку возврата, это практически безвредно.
Kelvin
29
См. Комментарий Марко ниже - вы должны вызвать это на контроллере, который собирается отправить что-то новое, а не на контроллер, который нажимается.
Билл
97

Подход Marc W отлично сработал, когда я понял, к какому контроллеру применить его: тот, который меняет название, а не тот, который находится сверху. Итак, если это стек навигации:

(bottom)  ControllerA -> ControllerB  (top)

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

Так что это больше в контексте self.title, а не в отличие от других установщиков левой / правой кнопок панели.

Марко
источник
13
Это очень важная деталь.
Билл
4
wcochran, он действительно работает с раскадровкой, просто убедитесь, что вы установили кнопку «Назад» на родительском контроллере. Итак, если у вас есть контроллер A, который указывает на контроллер B (через переход раскадровки), то для настройки текста для кнопки «Назад» в контроллере B вам необходимо установить свойство «Кнопка возврата» для контроллера A в редакторе раскадровки.
прерывание
Спасибо, Марко. Что я чувствовал по поводу этого вопроса, так это то, что все пытаются ответить (и ответить правильно), но не на тот вопрос, который задают. Вы попали в точку и правильно. Спасибо за это!
theiOSguy 03 авг.13,
+1 за важную деталь. Приведенный выше ответ не сработает, если вы не поймете ЭТОГО ответа.
baptzmoffire
Вы правы, к клавиатуре нового MacBook One немного сложно привыкнуть.
Мейсон Дж. Жвити
48

Вы можете сделать это в раскадровке. Найдите контроллер представления, к которому вы хотите вернуться (тот, который имеет длинный заголовок), выберите его элемент навигации и откройте инспектор атрибутов (Alt + Cmd + 4), вставьте настраиваемый заголовок кнопки «Назад».

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

алёка
источник
Это было именно то, что мне было нужно, так как я хотел, чтобы все кнопки возврата имели текст «Назад» вместо заголовков навигации предыдущего контроллера.
Дэйв
8
Следует отметить, что текст кнопки «Назад» задается для представления, из которого был нажат следующий контроллер, а не для отображаемого вами контроллера представления.
Darbio
Это хорошее простое решение, но, пожалуйста , не переименовывайте все кнопки возврата на «Назад», это противоречит HIG от Apple и частично сводит на нет назначение кнопки возврата. :(
Сэмюэл Гудвин
Сработало отлично. Только не забудьте СОХРАНИТЬ файл раскадровки. Моя первая попытка не сработала, потому что я не заметил, что Раскадровка не сохранилась! И да, вы меняете кнопку НАЗАД на контроллере представления, откуда вы пришли!
EricWasTaken
Хорошо, а что, если я хочу оставить только стрелку без текста? :)
Юрий Василенко
40

Спасибо, Марко ... это помогло мне ...

Вот что я сделал.

Если вы используете tableView для перехода к разным представлениям ... введите код:

self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil] autorelease];

В твоем didSelectRowAtIndexPath методе ... первого контроллера ... контроллера A.

Когда вы переходите к контроллеру B, кнопка будет иметь название «Назад».

Бен Колл
источник
1
Спасибо, дорогой @Ben. Это было именно то, что я искал :).
Арслан
12

Кнопка возврата извлекает свой текст из заголовка родительского контроллера представления.

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

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

в viewDidLoadметоде RootViewController.m :

self.title = @"Home";

в viewDidLoadметоде SecondViewController.m :

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];    

Если вы хотите, чтобы ваша кнопка «Назад» читалась как «Назад», установите заголовок родительского контроллера представления на @"Back";

Роза Перроне
источник
10

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

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Фелипе FMMobile
источник
1
Отличный ответ сработал идеально. он должен быть помечен как исключенный.
Мухаммад Ризван
9

Если вы используете раскадровку:

  1. Открыть StoryBoard
  2. В окне структуры документа найдите ViewController, к которому вы хотите вернуться.
  3. Щелкните элемент навигации этого ViewController
  4. В проводнике атрибутов измените значение кнопки «Назад» на пользовательскую плитку.

Вот и все, наслаждайтесь ...

AntonijoDev
источник
5

А в MonoTouch работает (в ViewDidLoad родительского контроллера):

NavigationItem.BackBarButtonItem = new UIBarButtonItem( "Back", UIBarButtonItemStyle.Plain, null);
BillF
источник
3
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc]
  initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil]];

Это сработало для меня.

user1004911
источник
3

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    self.navigationItem.backBarButtonItem = 
       [[UIBarButtonItem alloc] initWithTitle:@"title" 
                                        style:UIBarButtonItemStylePlain 
                                       target:nil 
                                       action:nil];

}

Обратите внимание, что нам не нужно включать autoreleaseв конце последнюю версию iOS.

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

Зорайр
источник
1

[self.navigationController.navigationBar.backItem setTitle:@"back"];

Меня устраивает. Вы можете заменить «спину» на что-нибудь другое.

омер
источник
При ответе кодом всегда объясняйте, в чем была проблема с предоставленным кодом и как ваш код устраняет проблему.
Лукас Кнут
1

Этот сработал для меня, если вы не хотите иметь титул!

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
гпихлер
источник
1
self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
user2783798
источник
0

Я наконец понял, почему эти ответы не помогли мне сначала. Я установил заголовок в раскадровке. Когда я устанавливаю заголовок в коде. оно работает!

self.navigationItem.title = @"Main Menu";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
user2547667
источник
В будущем вы, возможно, захотите публиковать подобные сообщения в качестве комментариев к ответу, который вам не подошел.
Keith Smiley
0

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

Поэтому я помещаю изменение заголовка в вызывающий контроллер представления, когда нажимаю другой контроллер представления, например:

self.pushedVC = [self.storyboard instantiateViewControllerWithIdentifier:@"pushedVCIdentifier"];
self.pushedVC.delegate = self;   
[self.navigationController pushViewController:self.pushedVC animated:YES];
self.title = @"Back";

и в функции обратного вызова делегата (которую я вызываю в viewWillDissapear):

-(void)pushedVCWillClose:(PushedVC *)sender
{
    self.title = @"Previous Title";
}
Деспотович
источник
0

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

jianpx
источник
0

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

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        //Set Title for this view
        self.navigationItem.title = "My Title"

}

override func viewWillDisappear(animated: Bool) {
        super.viewWillAppear(animated)
        //Set Title for back button in next view 
        self.navigationItem.title = "Back"
}
Джон Карто
источник
0

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

InformationVC *infoController=[[InformationVC alloc]init];[self.navigationController infoController animated:YES];

//Below code changed back button title on InformationVC page.
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Information" style: UIBarButtonItemStylePlain target: nil action: nil];
self.navigationItem.backBarButtonItem = backBarButton;`enter code here`
Kiran K
источник
0

В Swift5 нельзя редактировать backBarButtom. Следовательно, нам нужно сначала скрыть backBarButtom, а затем использовать настраиваемый leftbarButtom для замены backBarButtom. Вот подробное решение: https://stackoverflow.com/a/63868300/13939003

Майкл Лин Лю
источник
-1

Это сработало для меня:

self.navigationController.navigationBar.topItem.title = "Back"
Рокки
источник