タイトルなしのUINavigationBarカスタム戻るボタン


231

タイトルなしでiOS 7以降のナビゲーション戻るボタンをカスタマイズするにはどうすればよいですか?(つまり、矢印のみ)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

self.backButtonItemがあるかどうか疑問に思っています。

または

このようなもの?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
@hiroshi answer +ナビゲーションバーのtintColorプロパティを使用して、カスタムカラーでタイトルなしのシェブロンを作成できます
Dmitry Zhukov

タブバーがあり、戻るボタンのテキストが不要な場合、修正は次のとおりです。TabBarControllerのviewDidLoad()でput:self.navigationItem.backBarButtonItem = UIBarButtonItem(title: ""、style:。プレーン、ターゲット:nil、アクション:nil)
Borzh

回答:


313

それは実際にはかなり簡単です、これが私がすることです:

目的C

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

スウィフト2

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

スウィフト3

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

スタックにプッシュしているビューコントローラー前のビューコントローラー)にこの行を置きます。新しくプッシュされたビューコントローラーの戻るボタンには、initWithTitleに設定したものがすべて表示されます。この場合は空の文字列です。


3
私はこれを使用しましたが、タイトルがアニメーションで消えたり消えたりしますか?
user1010819 2013年

7
カイルありがとう!私はiOS 7でデフォルトの戻るボタンの名前を変更する方法を探していました。これをprepareForSegueビューコントローラーの自分の中に入れれば、完全に機能しました。
yiwei 2014年

1
@ user1010819これは予想される動作です。barButtonItemsは、ビューコントローラを切り替えるとアニメーション化します。あなたは何を成し遂げようとしているのですか?
Kyle Begeman、2014年

1
@YiweiGao問題ありません!これは、適切なコードを知っていれば、非常に単純なことの1つにすぎません。お役に立てて嬉しいです!
Kyle Begeman、2014年

3
これには更新が必要なようですが、現在何も表示されていません。矢印はデフォルトではありませんか?
Mathijs Segers 2015年

198

iOSの単一矢印で戻るボタンを作成する簡単な方法を見つけました。

ViewBからViewAに移動するナビゲーションコントローラーがあるとします。IBで、ViewAのナビゲーションバーを選択すると、次のオプションが表示されます。タイトル、プロンプト、戻るボタン。

ViewAナビゲーションバーオプション

ViewAナビゲーションバーオプション

トリックは、前のビューコントローラー(ビューA)のオプションで、運命のビューコントローラーの戻るボタンのタイトル(ビューB)を選択することです。オプション「Back Button」を入力しない場合、iOSは自動的に「Back」というタイトルを付け、以前のビューコントローラーのタイトルを付けます。したがって、このオプションを1つのスペースで埋める必要があります。

「戻るボタン」オプションのスペースを埋める

「戻るボタン」オプションのスペースを埋める

結果:

結果:


Stack Overflowへようこそ。まだ行っていない場合は、ツアーの内容をご覧になり、ヘルプセンターの記事で、私たちの働き方やコミュニティの慣習についての記事を読んでください。サイトの機能についてサポートが必要な場合は、検索を恐れずにメタスタックオーバーフローで質問してください(それでも回答が見つからない場合)。ありがとう、そして幸運を!とにかく、今すぐ画像を投稿できます... :)
Qantas 94 Heavy

53
機能します。注意してください。以前のコントローラー(ナビゲーションコントローラーの
rootViewControllerなど

ViewAのナビゲーションアイテムで "hidesBackButton"がTRUEに設定されていないことを確認してください
shim

これは、提示するコントローラーのタイトルが十分に長い場合に機能するように見えます-短いタイトルの場合は、代わりに使用されます。
amergin 2014

1
私にとって、ソースと宛先の両方のViewControllerのNavigationItemがBack Button単一の空白文字(つまり、ViewAとViewBの両方)に設定されている場合にのみ機能します
dcestari

72

画像を使用してください!

OBJ-C

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

アイコンバック

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


4
このソリューションでは、「スワイプして戻る」機能が失われているようです。
j7nn7k 2016

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfスワイプバックジェスチャーを維持するためのトリック
ビクターカルモーゼ2017年

私はこの答え、たぶん私の人生、つまりアクションセレクターを探してきました。
Des

29

iOS7には新しいインターフェースルールがあるため、UIViewをプッシュするときは少なくとも戻る矢印を保持することをお勧めします。プログラムで「戻る」テキストを変更するのは非常に簡単です。ビューをプッシュする前にこのコードを追加するだけです(またはStoryBoardsを使用している場合はprepareForSegue):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

これにより、デフォルトの「戻る」テキストが変更されますが、iOS7スタイルの戻る矢印は保持されます。ビューを押す前に、戻る矢印の色合いの色を変更することもできます。

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

これがあなたに役立つことを願っています!


2
これは本当にうまく機能し、他のオプションよりも優れているようです。たとえば、他の回答とは異なり、タイトルを以前の値にリセットする必要はありません。
pr1001 2013年

26

何もする必要はありません。ストーリーボード自体でも同じことができます。

ルートナビゲーションコントローラーに移動して、スペースを空けるだけです。タイトルなしの戻るボタンが必要なコントローラーではなく、ルートナビゲーションコントローラーを思い出してください。

以下の画像の通り。 これはiOS 7およびiOS 8で機能します


私はそれを試しました、それはうまくいきます。しかし、コードのタイトルはまだ変更できません。
Yu-Lin Wang

XCode7で動作しましたが、xCode8-> ios10.Xでは動作しなくなりました。@ iwasrobbedメソッドを使用しました
LucioB

すべての天才は簡単です!
Illya Krit 2017

22

一方でカイルBegemanの答えは完全にトリックを行い、可能なコントローラすべてのビューでこのコードを持っていることは非常に迷惑です。単純なUINavigationItemカテゴリになってしまいました。注意してください、ここでドラゴンになります!すみません、つまり、スウィズリング:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
私は賛成しましたが、代わりに単純なハックを使用することにしました- [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault];ソース)-少しエレガントではないかもしれませんが、スウィズリングはやり過ぎのように感じました
dmur

2
本当に真剣に...他の解決策に合格しないでください。カテゴリーとして投稿された@nickyのソリューションを実装し、二度と考えないでください。これは、このPrefix.pchファイルを追加すると、アプリ全体に実装できる優れた再利用可能なソリューションです。Appleは、カテゴリを使用して既存のクラスにメソッドを追加することをお勧めします。可能であれば、これを利用する必要があります。
zmonteca 2015年

これは私の意見では最良の解決策です。とにかく "method_exchangeImplementation"は少し安全ではありません。これを見てください。スウィズルする正しい方法とこのNSHipsterスウィズリングガイド
AlessandroOrrù16年1

@AlessandroOrrùこの特定のケースでは、スウィズルされたメソッドはUINavigationItem「独自のメソッド」であり、継承は含まれないため、これは安全です。そして_cmd、ゲッターに関与することはほとんどありません。とにかく、それは良い点です。プロジェクトにこれらの多数のスウィズリングヘルパーがある場合は、ここでも使用してください。
secondcitysaint 2016年

21

編集:2014-04-09:評判を得たとき、私はこのトリックをもう使用しないので残念です。カイルの答えをお勧めします。また、「戻る」ボタンが表示されているビューコントローラselfself.navigationItem.backBarButtonItemはなく、前のビューコントローラに戻ることに注意してください。

前のView Controllerのタイトルテキストが必要ない場合は、タイトルに空の文字列を入力してください。

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

これにより、プッシュされたビューコントローラーでシェブロンを使用して「戻る」と表示されなくなります。

編集:非空白のタイトルテキストを使用していても、以前のビューコントローラーのタイトルを設定すると、viewWillAppear:ビューコントローラーがポップしたときにタイトルが点滅する場合があります。「ツイッターアプリ」はちらつきをさけるために微妙なハックをしているようだ。


唯一の問題は、ナビゲーションバーを押して前のビューのタイトルに戻ると空白になることでした。それを回避する方法はありますか?
Alioo 2013年

@Alioo私が「編集」行で言及したことを試しましたか?
hiroshi 2013年

20

これは機能しますが、前のアイテムに戻ってポップしても、タイトルは削除されます。

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

viewDidLoadプッシュされたView Controllerのこのプロパティを設定するだけです。


17
これにより、前のアイテムに戻ってポップしても、タイトルが削除されます。あまり良くない:(
Antzi 2013年

プッシュVCのタイトルをオンにviewWillAppear設定したので、常に適切に設定されます。
Guto Araujo 2013年

@GutoAraujo動作しますが、タイトルが1秒または2秒の遅延で再表示されるため、魔女はUXをそれほど良くしません。
fuiiii 14

xCode8-> ios10.Xでは、これが問題に対処する唯一の方法のようです
LucioB

12

これが私のやり方であり、最も簡単で効果的で、最も明確な方法です。

これは、埋め込みで機能します Navigation Controller

スウィフト3

これviewDidLoadをView Controllerに追加すると、戻るボタンを矢印だけにする必要があります。

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

これと@Kyle Begemanの答えの違いは、プッシュボタンのスタックビューコントローラーではなく、戻るボタンを単に矢印にしたいビューコントローラーでこれを呼び出すことです。


7

希望する方法でナビゲーションbackButtonItemにアクセスできないため、以下のように独自の戻るボタンを作成する必要があります。

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

そしてもちろん:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

それから、戻るボタンで起こった素晴らしいフェードアウトアニメーションを失いました
Kiddo

3
スムーズな移行にはマスクが必要です。「*カスタム画像を使用してデフォルトのシェブロンを置き換える場合は、カスタムマスク画像も作成する必要があります。iOS7は、マスクを使用して、ナビゲーション中に前の画面のタイトルがシェブロンから浮き出たように見えるようにします。移行。」
ユーザー

3
@nullの場合、iOS 7の左右のスワイプジェスチャーが失われます。
Mazen Kasser 2013年

@userカスタムイメージを取得しますが、ティントカラーはデフォルトで青です。色合いを追加する方法を教えてください。感謝
Mazen Kasser 2013年

7

ターゲット: すべての戻るボタンをUINavigationBar白いアイコンにカスタマイズする

手順: 1. AppDeleteの "didFinishLaunchingWithOptions"メソッドで:

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2. viewDidLoad共通のスーパーViewControllerクラスのメソッドで:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

これは、「暗黙的なSYSTEM_VESION _...のバージョン」がC99では無効であることを示しています。
Jayprakash Dubey 2014

7

SWIFT 4

カスタムの戻るボタンを作成し、タイトルを削除したい場合は、ビューコントローラー内で次のコードを使用して、新しいボタンをプッシュしてください。

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

より普遍的に使用するには、次の操作を行います。

  1. 次のようにユニバーサル関数を作成します。

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. 次に、次のようにビューコントローラで使用します。

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

iOS6からの単純なハックはiOS7でも機能します。

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

編集: このハックを使用しないでください。詳細についてはコメントを参照してください。


6
このハックを使用しないでください。64ビットデバイス上のAppleのコードにはバグがあり、バーボタンのタイトルをオフセットするとモーダルビューが表示されなくなります。詳細
zh。

シミュレータではなく、デバイスに問題があっただけです。
zh。

Xcode 9 / iOS 11でビルドした場合、このハックは機能しなくなります。「<」が低く表示され、デバッガーで実行すると、制約が壊れていることがわかります。
T'Pol

3

あなたはこれを使うことができます。これUIButtonは、のcustumviewとしてを追加するだけで完全に機能しますUIBarButtonItem

以下のコードを試してください

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}

3
ただし、これによりiOS 7のスワイプバックジェスチャーが無効になります
user102008

3

UILabelルートビューコントローラーに必要なタイトルでを作成し、それをビューコントローラーのに割り当てnavigationItem.titleViewます。

タイトルを空の文字列に設定すると、次に押すビューコントローラーにテキストのない戻るボタンが表示されます。

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

すべての回答が問題を解決するわけではありません。すべてのビューコントローラーで戻るボタンのタイトルを設定することはできません。タイトルにオフセットを追加すると、次のビューコントローラーのタイトルが右に移動します。

メソッドのスウィズリングを使用するメソッドは次のとおりです。UINavigationItemの新しい拡張を作成するだけです

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

「戻る」ボタンを「戻る」という単語に設定すると、うまく機能します。self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel、

メイトとはどういう意味ですか?問題は、戻るボタンからテキストを削除することでしたか?
jakub wolanski

1
多くのアプリとApple独自のアプリは「<戻る」と言うので、標準に固執するのは良いことです。BigTakeAwayとJustEat。
Mike Zriel、2016年

2

次のコードをviewDidLoadに適用しましたが、機能します。

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

更新するだけで私はベクトルのアイコンを使用します


2

UINavigationControllerをサブクラス化し、それ自体をデリゲートとして設定し、デリゲートメソッドでbackBarButtonItemを設定できます。 navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

バックタイトルを空に設定

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

戻る画像を変更

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

私はiOS 5以降、このソリューションを問題なく使用しています。私はビューコントローラーで呼び出すユーティリティ関数を作成しました。あなたはそれをviewDidLoadまたはその後の任意の時点で行う必要があります。

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

ナビゲーションアイテムが既に存在する場合もあれば、作成する必要がある場合もあります。これは、ナビゲーション項目のタイトルをいじることなく、これらの両方のケースを考慮しています。を渡すだけで、タイトルを削除できます@""


1
これが正解です。トリックはありません。これは、タイトルを設定するために、意図された方法でiOS APIを使用しているだけです。タイトルを削除するには、@ ""に設定します(テスト済みで正常に動作します)。
n13 2015

1

私のために働いた唯一の方法は:

navigationController?.navigationBar.backItem?.title = ""

更新:

セグエアニメーションフラグをtrueに変更したとき(以前はfalseでした)、私のために機能した唯一の方法は次のとおりです。

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

1

Navigation Controllerに2つのViewController(FirstVC、SecondVC)Embedがあり、SecondVCに戻る矢印のみが必要な場合。

あなたはこれをFirstVCのViewDidLoadで試すことができます

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

次に、SecondVCにプッシュすると、戻る矢印しかありません。


1

TintColor Of NavigationBarを設定する場合は、タイトルのないカスタムの戻るボタン画像を追加します。その色は画像の色を反映します。このアップルのドキュメントリンクをクリックしてください。

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];


1

これを簡単にするための拡張機能を書いています。

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

viewWillDisappearで現在のViewControllerのタイトルを@ ""に変更し、再び表示されるときに、タイトルを以前のものに再設定します。

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

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

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

これの唯一の問題は、戻るボタンを押したときに以前のビューにタイトルがないため、viewWillAppearに再度追加できることです。

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

私はこのソリューションがあまり好きではありませんが、うまくいき、他の方法を見つけることができませんでした。


ナビゲーションアイテムのタイトルをいじることなく、正しい解決策について私の回答を参照してください。
ディマ2013年

あなたのソリューションはiOS7の戻る矢印を維持していますか?私は同様のことを試しましたが、矢印が削除されました。
アレハンドロフィゲロア

はい、iOS 7の戻る矢印を保持します。iOSの6で、これはこれを行うことはiOSの7のための唯一の本当に良いですので、ブランク(長さ0)の文字列を渡すことも、完全にかかわらず、ボタンを削除します
ディマ

非常にシンプルな解決策があります。私の答えがあなたのために働くかどうかを確認してください。
Guto Araujo 2013年

0

上記のThomas Cの回答に追加するには、スペースを1つ入れてもうまくいかないことがあり、スペースを追加し続ける必要があります。

空のバーボタン

「ナビゲーションアイテム」の下に「バーボタンアイテム-」が表示されると、成功したことがわかります。それはドキュメントアウトラインにあります([エディター]-> [ドキュメントアウトラインを表示])。上記の画像が表示されたら、いくつかのスペースを削除して、それがまだ機能するかどうかを確認できます。


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

Kyle Begemanと同じように、ルートビューコントローラーに上記のコードを追加します。すべてのサブビューコントローラが適用されます。さらに、これをinitWithCoder:メソッドに追加すると、xib、ストーリーボード、またはコードベースのアプローチでルートビューコントローラーのスタイルを適用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.