Как изменить заголовок кнопки "назад" на панели навигации



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



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



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



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


Что делать?



спасибо.

688   30  

30 ответов:

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

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

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

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

работает в Swift тоже!

self.navigationController!.navigationBar.topItem!.title = "Back"

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

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

посмотреть Контроллер A (the "родитель" - представление-контроллер):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

когда любой другой контроллер вида B находится на вершине стека навигации, и A прямо под ним, Bкнопка "Назад" будет иметь название "короткий".

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

например, на скриншоте ниже, я хочу, чтобы кнопка "Назад" для контроллера(ов) вида, который я нажимаю, имела "назад" в качестве названия спины кнопка.

enter image description here

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

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

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

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

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

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

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

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

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

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

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

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

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

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

хорошо, вот так. Если у вас есть контроллер вида "Первый", и вы перемещаетесь по другому контроллеру вида "второй", нажав кнопку или т. д. тебе нужно немного поработать. Сначала вам нужно создать BarButtonItem в методе ViewDidLoad контроллера вида" second " следующим образом;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

после этого вам нужно написать код для действия "btnBack" в том же самом .файл, как эта М;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

вот и все.

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

после попытки кучу различных решений, это то, что я в конечном итоге делает (расширение на @john.к. ДОУ подход):

С Помощью Xcode 7.2, Swift 2

  1. в раскадровке добавьте Navigation Item до родитель просмотр сцены контроллера (не ребенок VC)

navigation item

  1. на Attributes Inspector новой Navigation Item, введите a space персонаж

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

Swift версия:

в файле ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}

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

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

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

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

на основе информации, которую я видел. Похоже, что предыдущий контроллер вида управляет своей собственной кнопкой "Назад", которая будет представлена на нажатом контроллере вида.

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

мой контроллер пригласить покупателя

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

но кнопка назад должна быть Invite

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

Я поместил этот код в верхней части реализация контроллера (.m) файл и он автоматически переопределил Метод супер.

- (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-запросом.

надеюсь, что это помогает

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

вот ответ:

на viewDidAppear:animated (не viewDidLoad) сделать следующее

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

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

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

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

self.title = @"";

поэтому, когда новая сцена представлена, задний текст не появляется.

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

Для Swift:

    // 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

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

такой:

CustomViewController.м

@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 отображается.

EDIT: это также поддерживает собственный вид кнопки "Назад" (левый элемент кнопки со стрелкой).

этот код тоже работает. Поместите это на корневой контроллер навигационного контроллера:

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

Я обнаружил, что лучше всего изменить заголовок текущего контроллера вида в стеке навигации на нужный текст кнопки "назад", прежде чем нажимать на следующий контроллер вида.

например

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

затем в viewDidAppear установить название обратно на нужный заголовок для оригинального ВК. Вуаля!

Im новый в iOS, но я предоставлю свой очень простой ответ на переопределение класса навигационного контроллера. У меня есть простое переопределение методов push и pop и сохранение названия предыдущего контроллера вида. Извините за вставку в блок js. Был немного смущен, как пройти его в обычном блоке кода.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

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

и в Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

вы можете поместить его везде, где вам нравится в коде в контроллере parrent, что позволяет вам иметь кнопки differenct для разных дочерних представлений.

большинство решений убивает оригинальный стиль BackButton (левая стрелка бар кнопка) при добавлении обычной кнопки с желаемым названием.
Поэтому, чтобы сохранить оригинальный стиль, есть 2 способа:
1-й: использовать недокументированный стиль кнопки (110 или что-то в этом роде), который я предпочитаю не делать. Но если вы хотите, вы можете найти, как это сделать здесь, на stackoverflow.
2-й: использовать идею Тренскова. Мне понравилось и я использую его немного изменился.
Вместо переопределения - (NSString*)title я решил сохранить исходный заголовок следующим образом (что позволяет мне использовать названия nib, а также данный заголовок в push state btw).

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original 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];
        self.title = backButtonTitle; 
    }
}

Это решение работает хорошо и выглядит родной. Также, если использовать его в методе viewDidLoad, он предотвращает выполнение более 1 раза.
Также я пробовал решение Jessedc, но это выглядит плохо. Это вызывает видимое изменение строки заголовка пользователя на лету от оригинала до желаемой задней кнопки и обратно.

это работает для меня как "упрощенная" версия предыдущих опубликованных ответов.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Не забудьте поместить код внутри родительского контроллера вида (например, вид, который имеет ваш табличный вид или UITableViewController),не дочерний или детальный вид (например, UIViewController).

вы можете легко локализовать строку кнопки Назад следующим образом:

backButton.title = NSLocalizedString(@"Back Title", nil);

ответ Стэна был лучшим. Но у него также есть проблема, когда вы используете контроллер с панелью вкладок и меняете заголовок контроллера, вы можете изменить заголовок панели вкладок too.So лучший ответ-изменить view_controller.navigationItem.только заголовок и используйте view_controller.navigationItem.заголовок в функции. Ответ здесь: (с ARC и добавьте их в viewDidLoad)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

в себе использовать, я делаю это функция, как это, просто есть функция с одним код строки в viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}

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

проблема: текст "назад" в навигационной панели не может быть заменен.

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

одно решение: если вы установите себя.название= " неважно..."вы увидите, что вместо "назад" появится "что угодно..."после нажатия нового контроллера вида.

используйте следующую строку кода:

UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"hello"
                                 style:UIBarButtonItemStylePlain
                                target:nil
                                action:nil];

self.navigationItem.leftBarButtonItems =[[NSArray alloc] initWithObjects:newBackButton, nil];

self.navigationItem.leftItemsSupplementBackButton = YES;

Comments

    Ничего не найдено.