it-swarm.com.ru

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

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

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

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

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

Что я должен делать?

Благодарю.

218
Dale

Это должно быть помещено в метод, который вызывает ViewController под названием «NewTitle» . Прямо перед оператором Push или popViewController.

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

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

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

Работает и в Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
92
Peter Pan

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

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

View Controller A ( «родитель» view контроллер):

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

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

80
Victor Bogdan

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

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

enter image description here

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

56
john.k.doe

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

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

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

41
seniorbenelli

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

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

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

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

25
Jessedc

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

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

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

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

18
Duncan Smith

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

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

Хорошо, вот способ. Если у вас есть контроллер вида «первый» и вы перемещаетесь по другому контроллеру вида «второй», нажимая кнопку или что-то еще, вам нужно проделать определенную работу. Сначала вам нужно создать BarButtonItem в методе ViewDidLoad «второго» контроллера вида следующим образом;

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

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

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

Это все.

17
EEE

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

После того, как я попробовал несколько разных решений, это то, что я в итоге сделал (расширяя подход @ john.k.doe):

Используя Xcode 7.2, Swift 2

  1. В раскадровке добавьте Navigation Item в сцену Parent View Controller (не дочерний VC)

 navigation item

  1. В Attributes Inspector вашего нового Navigation Item введите символ space в поле Back Button. Подробнее об этом позже.

 navigation item in View Hierarchy

 add a space character to the Back Button field

  1. В контроллере представления Parent добавьте следующий код:

фрагмент кода:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Объяснение:

Кнопка «Назад» относится к родительскому контроллеру представления. Navigation Item дает вам указатель на кнопку «назад», так что вы можете установить заголовок в коде или в раскадровке.

Заметка:

Если оставить текст Navigation ItemBack Button в качестве пустой строки по умолчанию, заголовок кнопки «Назад» станет «Назад».

Другие подходы работают, зачем использовать этот ?:

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

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

Изменение title родительского контроллера представления является самым быстрым решением для некоторых ситуаций. Однако это меняет родительский заголовок, поэтому вам нужно управлять состоянием. Вещи также запутываются с Tab Bar Controller, потому что изменения названия вызывают побочные эффекты с названиями Tab Bar Item.

15
Robert Chen

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

9
pedrouan

Swift версия:

У вашего ребенка ViewController:

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

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

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

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

6
Alex Reynolds

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

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

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

Шахта - Контроллер Приглашения Покупателя

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

но кнопку «Назад» нужно было пригласить

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

Я поместил этот код в верхнюю часть файла Контроллера (.m), и он автоматически переопределил метод super.

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

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

5
The Lazy Coder

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

self.title = @"";

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

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

5
Javier Calatrava Llavería

Вот ответ:

В viewDidAppear:animated (НЕ в viewDidLoad) сделайте следующее

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

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

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

5
Basheer_CAD

Для Свифта:

    // 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
5
Ryan R
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
5
Gopikrishna

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

Как это:

CustomViewController.m

@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.

Правка: Это также поддерживает внешний вид кнопки «Назад» (пункт кнопки со стрелкой влево).

4
Trenskow

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

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

Я новичок в 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
Sergey Brazhnik

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

Например

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

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

4
OneInABajilian

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

И в Свифте:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
4
onmir

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

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * [email protected]"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 и обратно.

3
Stan
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

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

3
chikuba

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

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

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

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

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

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

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

  static NSString * [email protected]"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 * [email protected]"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;
  }
}
1
jtianling

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

1
jianpx

ПРОБЛЕМА: «Назад» текст в панели навигации не может быть заменен.

ПРИЧИНА: метка «Назад» устанавливается на панели навигации после нажатия представления, потому что атрибут .title в родительском контроллере представления был установлен в ноль (или не инициализирован).

ЕДИНСТВЕННОЕ РЕШЕНИЕ: Если вы установите self.title = "Независимо от ...", вы увидите, что вместо "Назад" появится сообщение "Независимо от ..." после нажатия нового контроллера представления.

1
Javier Calatrava Llavería

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, и в инспекторе атрибутов рядом с «Идентификатором» введите «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
7stud

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

Если вы хотите изменить заголовок в 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
iOS

Используйте ниже строку кода:

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

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

self.navigationItem.leftItemsSupplementBackButton = YES;
1
Payal Maniyar

Согласно документу из UINavigationBar> backItem

 enter image description here

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

Но установка backItem.backBarButtonItem не работает в первый раз viewWillAppear. Установка topItem.backBarButtonItem работает только в первый раз viewWillAppear. Потому что navigationBar.topItem по-прежнему указывает на previousViewController.navigationItem. В viewWillLayoutSubviews обновляются topItem и backItem. Поэтому после первого раза viewWillAppear мы должны установить backItem.backBarButtonItem

ОТВЕТ: Установка backBarButtonItem для navigationItem предыдущего viewController независимо от того, когда и где в вашем текущем viewController (верхний viewController). Вы можете использовать этот код в viewWillAppear или viewDidLoad. Проверьте мой блог iOS Set Navigation Bar Заголовок кнопки «Назад» для подробного анализа.

 NSArray *viewControllerArray = [self.navigationController viewControllers];
    // get index of the previous ViewContoller
    long previousIndex = [viewControllerArray indexOfObject:self] - 1;
    if (previousIndex >= 0) {
        UIViewController *previous = [viewControllerArray objectAtIndex:previousIndex];
        previous.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
                                                         initWithTitle:backButtonTitle
                                                         style:UIBarButtonItemStylePlain
                                                         target:self
                                                         action:nil];
    }
1
situee

Если у вас есть более чем одна навигация

ParentViewController -> ChildViewController1 -> ChildViewController2

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

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

0
Rizwan Shaikh

Это работает для меня в Swift 4 и iOS 11. Чаще всего мне нужно делать это, когда пользователь нажимает на строку в табличном представлении, а новый контроллер представления помещается в стек навигации. Обычно я хочу, чтобы кнопка «Назад» была именем или каким-либо атрибутом объекта, представленного строкой, которая была нажата. Поэтому я обычно делаю это в didSelectRowAt... так: 

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

    let object = // get the object this row represents

    let backButton = UIBarButtonItem()
    backButton.title = object.name // or whatever
    self.navigationItem.backBarButtonItem = backButton

    // now show or segue to the next view controller
}
0
Murray Sagal

Кажется, что навигационный контроллер ищет

previousViewController.navigationItem.title

Если ничего там не ищет

previousViewController.title
0
Basem Saadawy