Изменение заголовка UIBackButtonItem - PullRequest
29 голосов
/ 31 января 2009

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

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

Есть идеи?

Ответы [ 14 ]

52 голосов
/ 31 января 2009

Я добился успеха, создав собственный UIBarButtonItem вместо того, чтобы установить заголовок существующего:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
47 голосов
/ 25 ноября 2010

Название кнопки «Назад»:

  1. Название предыдущего контроллера просмотра
  2. Название кнопки возврата элемента навигации предыдущего представления контроллера

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

25 голосов
/ 08 сентября 2009

Возможно уже ответили, но не просто.

self.navigationItem.backBarButtonItem по умолчанию ноль. Поэтому, если вы установите для него заголовок, ничего не произойдет, потому что это влияет на адресный объект nil. Это не выдаст ошибку, так как target-c позволяет обмениваться сообщениями с nil объектами.

ОТВЕТ: Вы должны создать свой собственный объект кнопки, чтобы установить его заголовок. Вы можете initWithTitle или создать его, а затем установить заголовок позже.

PS - как уже упоминалось, backBarButtonItem влияет только на его дочерние представления, которые помещаются поверх него в стеке навигации. В зависимости от того, как у вас спроектировано приложение, представление корня может не отображаться дальше и не может иметь кнопку возврата. Тем не менее, вы можете повлиять на leftBarButtonItem.

5 голосов
/ 08 июля 2010

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

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

Например, допустим, у нас есть класс 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";

1 голос
/ 24 апреля 2012

Ответы Михая Дамиана и Криса Ланди правильные.

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

Итак, я гарантирую, что я переустанавливаю backBarButtonItem каждый раз, когда меняю заголовок viewController:

self.navigationItem.title = @"New Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];
backButton.title = @"Back";
self.navigationItem.backBarButtonItem = backButton;
1 голос
/ 31 января 2009

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

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

0 голосов
/ 14 апреля 2016
- (void)pushViewController:(UIViewController *)controller 
             withBackTitle:(NSString *)backTitle 
                  animated:(BOOL)animated {
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backTitle
                                                                             style:UIBarButtonItemStyleDone
                                                                            target:nil
                                                                            action:nil];
    [self.navigationController pushViewController:controller animated:animated];
}

это работает.

0 голосов
/ 04 марта 2016

Предположение: в вашем контроллере навигации есть два ViewController RootViewController и DetailViewController .

  • Первый шаг: Вы должны переопределить задний заголовок RootViewController

    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"backTitle" style:UIBarButtonItemStylePlain target:nil action:nil];
    
  • Второй шаг:

    [self.navigationController pushViewController: detailVC animated: YES];

Готово! Вы увидите, что кнопка Назад DetailViewController имеет значение «backTitle»

0 голосов
/ 24 апреля 2013

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

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"back", @"") style:UIBarButtonSystemItemCancel target:self action:@selector(popViewController)] autorelease];

- (void)popViewController {
    [self.navigationController popViewControllerAnimated:YES];
}
0 голосов
/ 14 февраля 2012

Как упоминалось в предыдущем постере (Brenden), по умолчанию значение backBarButtonItem равно nil, поэтому установка его заголовка приводит к отправке сообщения объекту nil, который, конечно, игнорируется.

Если вы не хотите возиться с созданием вручную новой кнопки для установки ее названия, в Interface Builder есть обходной путь.

В IB для данного контроллера представления, который является частью стека navigationController, вы можете щелкнуть по элементу navigation, представляющему панель навигации. Когда вы нажимаете, инспектор свойств позволяет вам установить три свойства: Title, Prompt и BackButton.

Если в поле backButton вы вводите какой-либо старый случайный текст, это приводит к созданию экземпляра объекта backBarButtonItem и в вашем коде теперь вы можете установить его заголовок для любого текста, который вам нужен.

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...