it-swarm.com.ru

Удаление текста заголовка 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, в котором был только один шеврон. 

Благодарю.

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

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

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

200
andyleehao

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

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)

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

406
DonnaLea

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

example image

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

126
Nikita Kukushkin

Это работает для меня, чтобы отобразить только «задний» шеврон без какого-либо текста:

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

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

Примечание: я тестировал его только в iOS 7, что входит в сферу применения вопроса.

122
Guto Araujo

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

--Правка--

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

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

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

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

27
Kamaros

 enter image description here

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

Раскадровка

 enter image description here

От кнопки «Show Second View Controller» к второму контроллеру представления происходит переход. 

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

Код

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

26
Suragch
self.navigationController.navigationBar.topItem.title = @"";
15
Claudio Castro

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

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

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

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

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

11
DZenBot

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

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

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

10
Grahambo

Простое решение этой проблемы, работающее на 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 = @" ";

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

6
Matthes

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

Переопределите класс UINavigationBar и добавьте следующую строку кода:

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

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

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

6
rordulu

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

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

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

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

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

5
Alejandro Figueroa

Я смог собрать что-то вместе, используя ответ 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
    }
}

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

Предостережение: я проверял это только с помощью обычного UINavigationController Push/Pop. Там может быть дополнительное неожиданное поведение в других ситуациях.

4
BradB

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

Поэтому, когда предыдущий вид не имеет заголовка, в iOS 7 кнопка «Назад» будет иметь только стрелку без текста.

На viewWillAppear в режиме просмотра я вернул исходный заголовок.

3
Kof

Это с использованием подкласса 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
3
0yeoj

Swift 3

navigationController?.navigationBar.topItem?.title = ""
3
Jiří Zahálka
[[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];
3
Bill Xie
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

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

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

--Правка--

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

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

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

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

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

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

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

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

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

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)
    }
}
1
taku_oka

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

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

[temporaryBarButtonItem release];

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

1
Utkarsh 786

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

1
nurider

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

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

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

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

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
    }
1
S.M.Moinuddin. Shuvo

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

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
}
1
PeiweiChen
case : <Back as <

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

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

Правка:

.h файл

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

.m файл

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
0
Pratik Jamariya

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

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

0
zekel

Я перечисляю решения, которые работали для меня до сих пор.

override func viewDidLoad() {
super.viewDidLoad()   



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

 let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)  // 2

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

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



}
0
A.G

Просто введите один пробел для кнопки навигации «Назад»!

0
VirajP

Если вы хотите удалить заголовок кнопки «Назад» в iOS11, попробуйте! 

@implementation UIView (PrivateBackButton)

    + (void)initialize {
        if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            [NSObject hookInstanceMethodForClass:[self class] originalMethod:@selector(layoutSubviews) newMethod:@selector(mc_layoutSubviews)];
        });
    }

    - (void)mc_layoutSubviews {
        [self mc_layoutSubviews];
        [self updateiOS11LaterUI];
    }

    - (void)updateiOS11LaterUI {
        if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
        if (![self isKindOfClass:NSClassFromString(@"_UIBackButtonContainerView")]) return;

        [self removeAllSubviews];
        [self.superview mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(@44);
        }];
    }

    @end
0
l1Dan

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

Свифт:

UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)

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

0
Serhiy

Реализуйте свой собственный базовый класс UIViewController и переопределите setTitle:.

@interface CustomViewController : UIViewController
@end

@implementation CustomViewController

- (void)setTitle:(NSString *)title {
    super.title = @""; // This will remove the "Back" title
    UILabel *titleView = [UILabel new];
    // customize the label as you wish
    titleView.text = title;
    [titleView sizeToFit];
    self.navigationItem.titleView = titleView;
}

@end

Теперь в любой UIViewController, где вы хотите установить заголовок, вы можете просто написать self.title = @"MyTitle", как обычно, и никакой текст не появится на элементе задней панели при нажатии новой UIViewController.

0
Avi