Изменение названия UIBackButtonItem

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

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

Любые идеи?

Ответ 1

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

  • Заголовок предыдущего контроллера представления
  • Имя предыдущей кнопки навигации навигационного элемента предыдущего элемента управления

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Еще одна вещь, которую следует отметить, это то, что если вы измените свой 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;

Ответ 8

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

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

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

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

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

Ответ 9

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

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

- (void)popViewController {
    [self.navigationController popViewControllerAnimated:YES];
}

Ответ 10

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

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

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

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

Это сделано! Вы увидите кнопку Back Button DetailViewController - это "backTitle"

Ответ 11

- (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];
}

работает.

Ответ 12

Это лучшее решение для этого, не устанавливайте заголовок navigationitem как обычно, как self.navigationitem.title. Поместите этот код в родительский вид didload

    CGRect frame = CGRectMake(0, 0, 320, 44);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:20.0];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor whiteColor];

self.navigationItem.titleView = label;
label.text = @"My Navigation Bar";

Установив заголовок, как указано выше, фактический заголовок навигации будет равен нулю, поэтому заголовок задней панели автоматически будет "Назад"

Ответ 13

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

Ответ 14

У меня есть интересное решение:

В методе, который переходит ко второму представлению (IBAction или didSelectRaw и т.д.), я перехожу к заголовку, который я хочу в заголовке элемента back, например: self.title = @"Inbox";. Кроме того, я добавляю метод ViewWillApear для изменения названия, когда пользователь нажимает на основной заголовок.