Удаление текста заголовка iOS UIBarButtonItem

Я хотел бы удалить текст из кнопки "Назад" UIBarButtonItem, оставив только синий шеврон на панели навигации. Имейте в виду, что я разрабатываю для iOS 7. Я пробовал несколько методов, включая, но не ограничиваясь:

Это метод изображения, который мне не понравился (изображение выглядело неуместным):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

Другой метод, который я пробовал, был таким, который просто не работал (ничего не отображалось):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
[email protected]"";
self.navigationItem.leftBarButtonItem=barBtn;

То, что я хотел достичь, - это что-то вроде кнопок на задней панели, найденных в приложении iOS 7 Music, в котором был показан только один шеврон.

Спасибо.

Ответ 1

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

Затем вы можете удалить заголовок элемента "Назад".

Если вы используете Storyboard, вы можете установить навигационную атрибуту контрольной кнопки Back Button с пробелом.

Ответ 2

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

Objective-C:

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

Swift:

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

Чтобы быть ясным, это делается на контроллере представления, который вы увидите, если вы нажмете кнопку "Назад"., а не видеть "< Настройки" вы хотите просто увидеть '<' то на вашем SettingsViewController вы поместите это в свой init. Тогда вы не получите никаких проблем с названием, которое не отображается, когда вы смотрите на сам контроллер представления.

Ответ 3

Если вы используете раскадровки вы можете перейти к Attributes Inspector в ViewController Navigation Item (нажмите на Navigation Bar) и установить Back Button свойство "" (один символ пробела). Это установит заголовок кнопки "Назад" на один пробел, оставляя шеврон видимым. Не нужно связываться с кодом.

example image

Обратите внимание, что это установит заголовок Back Button "Назад", которая будет переходить к этому контроллеру вида из той, которая была нажата поверх него, а не для Back Button которая будет отображаться внутри этого контроллера!

Ответ 4

Это работает для меня, чтобы отобразить только "назад" шеврон без текста:

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

Задайте это свойство в viewDidLoad контроллера просмотра, представляющего панель навигации, и это сделает трюк.

Примечание. Я тестировал его только в iOS 7, который находится в пределах объема вопроса.

Ответ 5

Когда вы устанавливаете заголовок кнопки, используйте @ "вместо @" ".

- EDIT -

Что-нибудь меняется, когда вы пытаетесь использовать другие строки? Я сам успешно использую следующий код:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString - это переменная, которая установлена ​​на @ "или @" Назад ", в зависимости от того, включен ли я на iOS 7 или более низкую версию.

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

Ответ 6

enter image description here

Иногда полезно видеть вещи в контексте. Вот минимальный проект, который скрывает текст "назад", но показывает стрелку.

Раскадровка

enter image description here

От кнопки "Показать контроллер второго вида" происходит переход к второму контроллеру представления.

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

Код

FirstViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

Альтернативный метод (только IB, без кода)

На раскадровке выберите элемент навигации для первого контроллера представления (а не второго). Просто введите пробел для текста кнопки "Назад".

enter image description here

Ответ 7

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

Ответ 8

На iOS7 Apple представила два новых свойства для UINavigationBar, 'backIndicatorTransitionMaskImage' и 'backIndicatorImage'.

Просто позвонив один раз:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

Он отобразит нестандартное изображение вместо символа шеврона по умолчанию, наследуя цвет оттенка keyWindow.

И для удаления названия я предлагаю ответить Камаросу. Не забудьте вызвать этот код на контроллере представления, который нажимает ваш новый контроллер просмотра. Удаление текста заголовка iOS UIBarButtonItem

Ответ 9

У меня не было большого успеха с предоставленными ответами, но я действительно нашел очень простую работу. В своем раскадровке вы можете нажать на свой элемент навигации UIViewController и установить текст кнопки "Назад". Я установил его в одно "пространство", и он дал мне поведение, которое я искал. enter image description here

Ответ 10

Это работало для меня в iOS10. Вызовите это из viewDidLoad контроллера вида.

self.navigationController?.navigationBar.topItem?.title = ""

Ответ 11

Простым решением этой проблемы, работающей как с iOS7, так и с 6, является установка пользовательского заголовка в viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Затем, в viewWillAppear: вы можете безопасно позвонить

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

Поскольку ваше представление заголовка является настраиваемым, оно не будет перезаписано при перемещении в стеке навигации.

Ответ 12

На самом деле вы можете сделать это с помощью всего лишь одного трюка:

Заменить класс UINavigationBar и добавить эту строку кода:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

Затем инициализируйте свой UINavigationController с помощью этого пользовательского класса UINavigationBar и т.д. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

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

Ответ 13

В методе prepareForSegue: вашего первого ViewController вы задаете заголовок вида @ ", поэтому при следующем нажатии на него будет отображаться предыдущий заголовок ViewController, который будет @" ".

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

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

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

Мне не очень нравится это решение, но оно работает, и я не нашел другого способа сделать это.

Ответ 14

Я смог сжечь что-то вместе, используя ответ DonnaLea. Так появляется решение в моем подклассе UIViewController:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

Проблема с исходным ответом заключается в том, что он удаляет заголовок с контроллера, когда вы возвращаетесь к нему. Попытка reset заголовок в viewWillDisappear слишком поздно в процессе перехода; Это заставляет заголовок возвращаться, а не анимировать. Однако willMoveToParentViewController происходит раньше и допускает правильное поведение.

Предостережение: я тестировал это только с обычным UINavigationController push/pop. В других ситуациях может возникнуть дополнительное неожиданное поведение.

Ответ 15

SWIFT 3

navigationController?.navigationBar.topItem?.title = ""

Ответ 16

Не ответы помогли мне. Но трюк сделал - я только что очистил заголовок контроллера вида, который нажал (где кнопка назад), прежде чем нажимать его.

Итак, если предыдущий вид не имеет названия, на iOS 7 на задней панели будет только стрелка без текста.

В viewWillAppear нажимающего представления я вернул исходное название.

Ответ 17

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

У меня была такая же проблема, и я сделал это так.

- EDIT -

Это решение, когда вы действительно хотите удалить текст заголовка всего UIBarbuttonItem. Если вы хотите удалить заголовок элемента кнопки на задней панели, нет простого простого решения. В моем случае, поскольку у меня только несколько UIBarButtonItems, которые должны отображать текст заголовка, я просто изменил те ключевые слова titleTextAttributes. Если вы хотите более конкретно использовать приведенный ниже код, который будет изменять только кнопки панели навигации:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

Ответ 18

Это использование подкласса navigationController удаляет "Назад".

Я использую это, чтобы удалить его, навсегда через приложение.

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end

Ответ 19

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];

Ответ 20

Скрыть кнопку "Назад" Название панели навигации

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Ответ 21

Вот что я делаю, что проще удалить название кнопки назад

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

Ответ 22

Swift 3.1 Вы можете сделать это, реализовав метод делегата UINavigationController. Он будет скрывать только заголовок с кнопкой "назад", мы все равно получим изображение стрелки назад и функциональность по умолчанию.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

Ответ 23

Вы также можете использовать это:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

Это работает для меня

Ответ 24

case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

Ответ 25

Идеальное решение во всем мире

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}

Ответ 26

Я создаю пользовательский класс для UINavigationController и применяю его ко всем навигационным контроллерам в своем приложении. Внутри этого пользовательского класса UINavigationController я устанавливаю делегат UINavigationBar на self после загрузки представления.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

Затем я реализую метод делегата:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

Таким образом, я просто назначаю свой собственный класс всем моим контроллерам навигации, и он очищает заголовок от всех кнопок назад. И просто для ясности я всегда устанавливал заголовок для всех моих других контроллеров представления внутри viewWillAppear, чтобы заголовок всегда обновлялся непосредственно перед представлением (в случае его удаления с помощью трюков, подобных этому).

Ответ 27

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

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

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

Ответ 28

extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

Ответ 29

Это лучшее решение.

Другое решение опасно, потому что это взломать.

extension UINavigationController {

    func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
        viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        pushViewController(viewController, animated: animated)
    }
}

Ответ 30

Я не мог заставить его работать, используя ответ Гуто Араухо navigationBar.topItem.title = @"";

Однако я смог получить желаемый эффект, установив self.title = @"" в методе init моего контроллера представления. (Установка в init важна, viewDidLoad не будет работать.)