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

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

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

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

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

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

Спасибо.

Ответы [ 36 ]

4 голосов
/ 11 августа 2015

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

Например

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

Затем в viewDidAppear установите заголовок обратно к желаемому заголовку для исходного VC. Voila!

4 голосов
/ 13 октября 2016

Я новичок в 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
4 голосов
/ 15 марта 2015

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

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
3 голосов
/ 31 августа 2011
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

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

3 голосов
/ 02 апреля 2012

Большинство решений убивает оригинальный стиль BackButton (кнопка со стрелкой влево) при добавлении обычной кнопки с нужным заголовком.
Поэтому сохранить оригинальный стиль можно двумя способами:
1-й: использовать недокументированный стиль кнопок (110 или что-то подобное), который я предпочитаю не делать. Но если вы хотите, вы можете найти здесь, в stackoverflow.
2-й: использовать идею Тренскова. Мне понравилось, и я использую это немного изменилось.
Вместо переопределения - (NSString *) заголовка я решил сохранить исходный заголовок следующим образом (что позволяет мне использовать заголовки пера, а также заданный заголовок в состоянии push 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, но оно выглядит плохо. Это вызывает видимое для пользователя изменение строки заголовка на лету с исходного на желаемое BackButton и обратно.

2 голосов
/ 24 февраля 2014

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

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

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

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

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

backButton.title = NSLocalizedString(@"Back Title", nil);
2 голосов
/ 16 февраля 2018

У нас есть два ВК А и Б.

Если вы хотите изменить заголовок в B, напишите этот код в A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
1 голос
/ 25 мая 2019

Если у вас есть более одной навигации, которая

ParentViewController -> ChildViewController1 -> ChildViewController2

Вы можете использовать приведенный ниже код для изменения названия кнопки «Назад» на панели навигации.

self.navigationController? .NavigationBar.topItem? .BackBarButtonItem = UIBarButtonItem.init (title: "Back", стиль: .plain, target: nil, action: nil)

1 голос
/ 03 февраля 2018

Swift 4
iOS 11.2
Xcode 9.2

TableViewController1  ---segue--->   TableViewController2

Вы можете изменить текст кнопки «Назад» в TableViewController1 или TableViewController2.

Изменить текст кнопки возврата внутри TableViewController1 :

1) В viewWillAppear():

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let myBackButton = UIBarButtonItem()
    myBackButton.title = "Custom text"
    navigationItem.backBarButtonItem = myBackButton
}

По какой-то причине viewDidLoad () слишком рано, чтобы добавить кнопку возврата в NavigationItem. Чтобы соединить два TableViewController, перетащите элемент управления раскадровкой из TableViewCell в TableViewController1 в середину TableViewController2 и во всплывающем меню выберите Selection Segue > Show.

2) В tableView(_:didSelectRowAt:):

override func tableView(_ tableView: UITableView, didSelectRowAt: IndexPath) {

    let myButton = UIBarButtonItem()
    myButton.title = "Custom text"
    navigationItem.backBarButtonItem = myButton

    performSegue(withIdentifier: "ShowMyCustomBackButton", sender: nil)
}

Для соединения двух контроллеров TableViewController перетащите курсор из маленького желтого кружка над TableViewController1 в середину TableViewController2 и в раскрывающемся меню выберите Manual Segue > Show. Затем выберите последовательность, соединяющую два TableViewControllers, и в инспекторе атрибутов рядом с «Identifier» введите «ShowMyCustomBackButton».

3) В storyboard:

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


Изменить текст кнопки возврата внутри TableViewController2 :

1) В viewWillAppear():

class MySecondTableViewController: UITableViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let myBackButton = UIBarButtonItem(
            title: "<Custom text",
            style: .plain,
            target: self,
            action: #selector(goBack)  //selector() needs to be paired with an @objc label on the method
        )

        navigationItem.leftBarButtonItem = myBackButton
    }

    @objc func goBack() {
        navigationController?.popViewController(animated: true)
    }

Чтобы соединить два TableViewController, перетащите элемент управления раскадровки из TableViewCell в TableViewController1 в середину TableViewController2 и во всплывающем меню выберите Selection Segue > Show.

1 голос
/ 30 ноября 2012

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

  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;
  }
}
...