UINavigationController «кнопка возврата» пользовательский текст?

StackOverflow https://stackoverflow.com/questions/1441699

Вопрос

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

Это было полезно?

Решение

Из эта ссылка :

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

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

  

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

Другие советы

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

  

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

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

// 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";
}

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

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

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

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

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

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

-(void)viewWillAppear:(BOOL)animated {

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

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

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

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

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

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

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

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Таким образом, ответ Rein утечет памяти, потому что синтезированный установщик сохранит экземпляр, который вы передаете, который никогда не освобождается явно. Вы можете исправить это с помощью 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];

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

- (void)viewDidLoad {
  [super viewDidLoad];

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

Я обнаружил кое-что интересное. Если вы создаете подкласс 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 на контроллере навигации.

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

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

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

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

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

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

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

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

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

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

если вы хотите установить заголовок в контроллере 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 в расширение контроллера.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top