Пользовательский текст UINavigationController "назад"?

"Кнопка назад" UINavigationController по умолчанию показывает заголовок последнего представления в стеке. Есть ли способ иметь собственный текст вместо кнопки "Назад"?

Ответ 1

От эта ссылка:

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

Как сказал Тайлер в комментариях:

не делать этого в контроллере видимого вида, но в представлении контроллер, который вы увидите, если вы нажмете кнопку "Назад"

Ответ 2

Вы можете установить текст в построителе интерфейса:

Выберите элемент навигации ViewController, на который будет возвращена кнопка возврата:

enter image description here

В инспекторе атрибутов панели утилит введите свой ярлык для кнопки "Назад":

enter image description here

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

Также обратите внимание: вам нужно сделать это в контроллере представления на один уровень вверх стек. Другими словами, не делайте этого в контроллере видимого вида, но в контроллере просмотра, который вы увидите, если вы нажмете кнопку "Назад".
- Тайлер

Ответ 3

Я использую это:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

Ответ 4

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

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Затем обязательно установите исходное название в viewWillAppear, например:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

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

Ответ 5

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

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    [email protected]"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    [email protected]"Back";
}

Ответ 6

в вашем методе init, добавьте следующий код:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

затем добавьте простой метод, чтобы разрешить диспетчер просмотра:

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

Ответ 7

Добавьте следующий код в viewDidLoad или loadView

self.navigationController.navigationBar.topItem.title = @"Custom text";

Я тестировал его на iPhone и iPad с iOS 9

Ответ 8

Добавление для ответа на ответ. Обратите внимание, что объявления Apple, что объявление backBarButtonItem:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Следовательно, ответ на ответ будет утечка памяти, потому что синтезированный сеттер будет retain экземпляр, который вы передаете, который никогда не выпущен явно. Вы можете исправить это, используя autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

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

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

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

Ответ 9

- (void)viewDidLoad {
  [super viewDidLoad];

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

Ответ 10

Я обнаружил что-то интересное. Если вы подклассифицируете UINavigationController и переопределите метод pushViewController:animated: и выполните что-то вроде этого: (помните, что я использую ARC)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Затем для всех ViewControllers, которые нажаты на ваш навигационный контроллер, автоматически будет нажата кнопка "Назад". Если вы хотите изменить текст для определенных контроллеров представлений, вы можете попробовать и, возможно, включить диспетчер представлений в определенный класс или собственный собственный протокол (который наследует ваш viewcontroller, у которого может быть такой метод, как backButtonText или что-то глупое), которое может предоставить вам определенную информацию о viewcontroller, который поступает так, что вы можете настроить текст кнопки назад для него. Теперь текст обратной кнопки позаботится о месте, которое должно нести ответственность исключительно. Я должен признать, что создание новой кнопки для изменения текста отстой, но о хорошо.

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

Ответ 11

Расширяясь по предложению Обри, вы можете сделать это в контроллере дочернего представления:

создайте две переменные для хранения старых значений родительского элемента navigationItem.title и родительского элемента навигации

UINavigationItem* oldItem;
NSString* oldTitle;

в viewDidLoad, добавьте следующее:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

в viewWillDisappear, добавьте следующее:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

Это не идеально. Вы увидите название изменения родительского представления, когда новый контроллер будет анимирован. НО это достигает цели пользовательской маркировки кнопки "Назад" и сохранения ее в форме стандартной кнопки "Назад".

Ответ 12

Ответ на ответ хорошо работает.

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

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

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

Ответ 13

Поместите это в вас viewDidLoad, надейтесь, что это приведет к тому, что вы ищете

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

Ответ 14

если вы хотите установить заголовок в контроллере ARRIVING (иногда больше логики..) в быстрых 3 делать:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

в следующем контроллере:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

Обычно я добавляю self.setBackButtonNavBar в расширение контроллера.

Ответ 15

Я знаю, что это старый вопрос, и ответы вроде как обновлены!

Самый простой способ сделать это в родительском ViewController:

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

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

Ответ 16

Выполняя это в коде, удалите стиль кнопки "Назад" UINavigationConroller. Если вы добавите элемент навигации в каждое из своих представлений, вы можете установить заголовок back botton в StoryBoard.