UINavigationController "кнопка" назад пользовательский текст? - PullRequest
146 голосов
/ 18 сентября 2009

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

Ответы [ 16 ]

340 голосов
/ 18 сентября 2009

С по этой ссылке :

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

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

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

43 голосов
/ 27 марта 2013

Вы можете установить текст в Интерфейсном Разработчике:

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

enter image description here

В инспекторе атрибутов панели утилит введите метку для кнопки «Назад»:

enter image description here

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

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

22 голосов
/ 29 апреля 2010

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

// 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";
}
11 голосов
/ 04 февраля 2010

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

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

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

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

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

7 голосов
/ 21 августа 2012

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

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}
6 голосов
/ 02 апреля 2011

в вашем методе 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;
}

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

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}
3 голосов
/ 06 апреля 2016

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

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

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

2 голосов
/ 24 августа 2012

Я обнаружил что-то интересное. Если вы создаете подкласс 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 к определенному классу или вашему собственному пользовательскому протоколу (который наследует ваш viewcontroller, от которого может быть метод типа backButtonText или что-то глупое) может дать вам определенную информацию о контроллере представления, который идет в комплекте, так что вы можете настроить текст кнопки назад для него. Теперь текст кнопки «Назад» обрабатывается в месте, которое должно нести ответственность. Я должен признать, что создание новой кнопки для изменения текста - отстой, ну да ладно.

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

2 голосов
/ 03 декабря 2011
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}
2 голосов
/ 12 мая 2011

Добавление к ответу поводья. Обратите внимание на документы 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];

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

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