web-dev-qa-db-ja.com

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];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

私が達成したかったのは、iOS 7 Musicアプリにある戻るボタンのようなものです。

ありがとう。

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

その後、戻るボタンの項目のタイトルを削除できます。

ストーリーボードを使用している場合は、ナビゲーション属性インスペクタの[戻る]ボタンにスペースを設定できます。

198
andyleehao

タイトルを変更せずにView Controllerの戻るボタンのタイトルを設定するには、次のコマンドを使用します。

目的C:

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

迅速:

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

明確にするために、これはあなたが戻るボタンを押した場合に表示されるView Controller上で行われます。 SettingsViewControllerの '<'を見るだけで、これをinitに入れます。そうすれば、View Controller自体を見ているときにタイトルが表示されないという問題は一切発生しません。

409
DonnaLea

ストーリーボードを使用している場合は、ViewControllerのAttributes InspectorNavigation Itemに移動し(Navigation Barをクリック)、Back Buttonプロパティを ""(スペース1文字)に設定します。これにより、戻るボタンのタイトルが1つの空白文字に設定され、山形が表示されたままになります。コードをいじる必要はありません。

example image

これは、Back Button title このView Controllerに関連するBackボタン用をこのControllerの内側に表示されるBack Button用にではなく、その上にプッシュされたものに設定することに注意してください。

128

これは、私にとって、テキストなしで「後ろ」のシェブロンだけを表示するのに役立ちます。

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

ナビゲーションバーを表示しているView ControllerのviewDidLoadにこのプロパティを設定すると、うまくいきます。

注:私はiOS 7でテストしただけですが、これは質問の範囲内です。

122
Guto Araujo

ボタンのタイトルを設定するときは、@ ""の代わりに@ ""を使用してください。

- 編集 -

他の文字列を試したときに何か変化はありますか?私は自分自身で次のコードを使用しています。

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

backStringは、私がiOS 7またはそれ以前のバージョンのどちらを使用しているかによって、@ ""または@ "Back"に設定される変数です。

注意すべき1つのことは、このコードは、戻るボタンをカスタマイズしたいページのコントローラーにはないということです。それは実際にはナビゲーションスタック上でそれの前にコントローラにあります。

27
Kamaros

enter image description here

状況に応じて物事を見ることが役に立つ場合があります。これは「戻る」テキストを隠すがそれでも矢印を表示する最小のプロジェクトです。

ストーリーボード

enter image description here

「セカンドビューコントローラを表示」ボタンからセカンドビューコントローラへのショーセグエがあります。

また、ナビゲーションアイテムを2つ目の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のみ、コードなし)

ストーリーボードで、最初のビューコントローラ(2番目ではない)のナビゲーション項目を選択します。戻るボタンのテキストを入力するだけです。

enter image description here

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

IOS 7では、AppleはUINavigationBarに2つの新しいプロパティbackIndicatorTransitionMaskImageとbackIndicatorImageを導入しました。

一度だけ呼び出すことで:

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

デフォルトのシェブロングリフではなくカスタムイメージをレンダリングし、キーウィンドウの色合いを継承します。

そしてタイトルを削除するために、私はKamarosの答えを提案します。新しいコードをプッシュしているビューコードでこのコードを呼び出すことを忘れないでください。 iOS UIBarButtonItemのタイトルテキストを削除する

11
DZenBot

これはiOS10で私のために働きました。これをView ControllerのviewDidLoadから呼び出します。

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

提供された回答ではあまり成功しませんでしたが、本当に簡単な回避策が見つかりました。ストーリーボードで、UIViewControllerのナビゲーション項目をクリックして戻るボタンのテキストを設定できます。私はそれを単一のスペースに設定し、それが私が探していた行動を与えてくれました。enter image description here

10
Grahambo

この問題に対する簡単な解決策は、iOS 7および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

実際には、たった1つのトリックでこれを実行できます。

UINavigationBarクラスをオーバーライドして、次のコード行を追加します。

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

次に、このカスタムUINavigationBarクラスを使用してUINavigationControllerを初期化します。UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

お役に立てれば

6
rordulu

最初のViewControllerのprepareForSegue:メソッドで、そのビューのタイトルを@ ""に設定しているため、次のビューがプッシュされると、前のViewControllerのタイトル(@ "")が表示されます。

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

これに関する唯一の問題は、戻るボタンを押したときに前のビューにタイトルが表示されないことです。そのため、viewWillAppearにもう一度追加することができます。

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

私はこの解決策はあまり好きではありませんが、うまくいきますし、それ以外の方法を見つけることもできませんでした。

4

Swift

navigationController?.navigationBar.topItem?.title = ""
4
Jiří Zahálka

私は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

答えのどれも私を助けませんでした。しかし、トリックはしました - 押した直前(戻るボタンがあるところ)のView Controllerのタイトルをクリアしただけです。

そのため、前のビューにタイトルがない場合、iOS 7では、戻るボタンにはテキストがなくても矢印しか表示されません。

プッシュビューのviewWillAppearに、元のタイトルを戻しました。

3
Kof

これはサブクラスnavigationControllerを使用して "Back"を削除します。

私は恒久的にアプリを通じて、それを削除するためにこれを使用しています。

//.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
[[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のタイトルテキストを削除したいとき、これは解決策です。バックバーボタン項目のタイトルを削除したいだけであれば、簡単で便利な解決策はありません。私の場合は、タイトルテキストを表示する必要があるUIBarButtonItemがほとんどないので、それらの特定のボタンの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

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
    }

これが私がやっていることです、戻るボタンのタイトルを削除する方が簡単です

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

これはより良い解決策です。

他の解決策は危険なので危険です。

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内の他のすべてのView Controllerのタイトルを設定して、ビューが表示される直前にタイトルが常に更新されるようにします(このようなトリックによって削除される場合)。

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

戻るボタンのナビゲーション項目に1つのスペースを入力するだけで動作します。

1
VirajP

グローバルに完璧なソリューション

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

Guto AraujoのnavigationBar.topItem.title = @"";の答えを使用してもうまく動作しませんでした。

しかし、私は自分のView Controllerのinitメソッドにself.title = @""を設定することで望みの効果を得ることができました。 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

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では、次のコードを使用してボタンのタイトルを隠すことができます。

Swift:

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

このコードはナビゲーションバーからタイトルを削除しませんが、単に透明にして、戻るボタンにはタイトルのスペースを保持します。 View Controllerのタイトル用のスペースを増やす必要がある場合は、別の解決策を使用する必要があります。

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