すべてのナビゲーションバーの戻るボタンのタイトルを削除する方法


83

を押すとUIViewController、新規の戻るボタンにUIViewControllerタイトルがあります。タイトルにテキストが多いと、iPhone 4sでは見栄えが悪いので、削除したいと思います。

prepareForSegue関数にコードを追加すると、問題が発生します。

これを達成するためのより良い方法はありますか?


戻るボタンのタイトルを変更することもできます。戻るには、戻るボタンが必要です。だから戻るボタンを外す必要はないと思います。
Ashok Londhe 2015

問題を解決した後にお知らせください。
Ashok Londhe 2015

この回答を参照してくださいstackoverflow.com/a/48801613/3976183–
Lalit Kumar

この問題についての素晴らしい記事がありますsarunw.com/posts/...
user3672430

回答:


129

戻る矢印が必要な場合は、次のコードをAppDelegateファイルに入れてdidFinishLaunchingWithOptionsメソッドに入れます。

For Objective-C

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

For Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

別のオプションを以下に示します。

Objective C

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

Swift

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

更新:

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

UPDATE SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

オフセットの使用

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)

だからあなたの問題は解決されたのかもしれません。

ハッピーコーディング。


8
setBackButtonTitlePositionAdjustment戻るボタンのタイトルが非常に長いが、「戻る」に変更するのに十分な長さではない場合、中央のタイトルが右に移動するため、常に機能するとは限りません。
zgjie 2016年

3
@zgjieそれはあなたのオフセットがどれだけ大きいかという問題です。'-60'を '-6000'に簡単に置き換えることができ、この問題を忘れることができます
slxl 2016

10
ここで少し正確に言えば、タイトルはPREVIOUSビューコントローラーに属しています。したがって、presentViewControllerまたはpushViewControllerメソッドの前に設定することを忘れないでください。
ベンジャミン

1
うーん、これはAppDelegateでは機能しません。「タイプAppDelegateの値にはメンバーnavigationItemがありません」
Prabhu

3
@DominikBucherこの動作のカテゴリを作成しました。これは、アプリ内のあらゆる場所から戻るボタンのタイトルを非表示にするもので、「NON HACKY」の方法です。プロジェクトにカテゴリを追加するだけで、完了です。setBackButtonTitlePositionAdjustment:forBarMetrics:ユーザーがユーザー補助設定からボタンの形状を有効にした場合、形状が表示されて醜いナビゲーションバーになるという、位置の設定の解決策に強く同意しません。
Pratik Jamariya 2017

72

Swift3の魅力のような作品

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

1
これは、使用時に機能した唯一のものですnavigationController?.pushViewController(_, animated:)
D. Greg

どうも。これがうまくいった唯一のものでした。乾杯。
フェリペ

3
私のためにも働いた
Swift4

1
@MaksimKniazev、その問題の修正はありますか?でタイトルを再度更新する唯一の解決策を見つけましたviewWillAppear:
Hemang 2018年

4
これにより、前のビューのタイトルが削除されます
Naser Mohamed

51

私は、中のコード行を使用しているAppDelegateにファイルdidFinishLaunchingWithOptions戻るボタンを削除する方法title

スイフト2.x

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

Swift 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

Swift 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)

17
setBackButtonTitlePositionAdjustment戻るボタンのタイトルが非常に長いが、「戻る」に変更するのに十分な長さではない場合、中央のタイトルが右に移動するため、常に機能するとは限りません。
zgjie 2016年

それは理想的な解決策ではありません。左側のナビゲーションバーアイテムのタイトルを変更せずにナビゲーションタイトルを設定すると、左側のナビゲーションバーのタイトルがはめ込まれているため、タイトルが右にシフトします。
mathema 2017年

2
iOS 11では、戻るボタンの位置を壊します。元の位置を下回っています
korgx9 2018

それはどのように機能するはずですか?テキストには引き続きVoiceOverからアクセスできます。
Lukasz Ciastko 2018

これは、イメージピッカーなどを提示するときにキャンセルまたは完了したbarbuttonitemが表示されない場合に問題を引き起こします
NupurSharma19年

16

他のViewControllerが依存している親ViewControllerに移動する必要があります。

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}

16

このコードをコピーするだけです didFinishLaunchingWithOptions launchOptions

スウィフト5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

スウィフト4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

12

それは単純だ。戻るボタンのタイトルにスペースを入れて準備します。テキストを削除する前のビューにある必要があることに注意してください。

ここに画像の説明を入力してください


最良のソリューションIMO。アプリ全体を特定の明確なスタイルに設定する必要はありません。これにより、テキストのbarbuttonitemが消えるという副作用が生じる可能性があります。コントローラーにnavigationItemがない場合は、コントローラーにドラッグする必要があると記載されていれば、回答が改善される可能性があります。
TheJeff

7

xcode8とswift3.0を使用できます

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

3
これにより、前のView Controllerからタイトルが完全に削除されませんか?
NRitH 2016年

1
はい、ViewControllerプッシュされたすべてのタイトルが削除されますself.navigationController
Yevhen Dubinin 2016

7

UIViewControllerこの動作が必要なすべてのサブクラスと、サブクラスのサブクラスを作成できますviewDidLoad

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

このようにして、コードを複製することなく、動作を希望するコントローラーを選択できます。以前のコントローラーのタイトルではなく、「戻る」とだけ言う方がコントローラーの方が好きなので、ここでそのタイトルを設定します。


6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

swift3.0でこのコード行を使用しました


1
UISearchControllerのためにキャンセルボタンを影響します
JAHelia

5

ここでのrorduluの回答からインスピレーションを得て、このトリッキーな問題のすべてのケースを処理するように見えるカスタムUINavigationControllerとUINavigationバーを作成することになりました。

1)UINavigationControllerカスタムで新規初期化UINavigationBar

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

2)backItem.titleビューがレイアウトされるたびに、ナビゲーションバーのプロパティを空の文字列に設定します

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

これで、このナビゲーションコントローラーとバーの組み合わせを使用するたびに、戻るボタンのテキストが表示されることはありません。🎉

注:ストーリーボードを使用している場合も、これは正常に機能するはずです。カスタムナビゲーションバーコンポーネントをビューにドロップしてください。


本当にありがとう!これはそれを行うための最良の方法であり、正しい答えであるはずです:)
GameDev 2017

3
これには、ナビゲーションアイテムのタイトルが完全に消去されるという副作用があることに気づきました。したがって、前のビューが表示されている場合、タイトルはありません。私はこの厄介な問題の完璧な解決策を探し続けます。
ハリーブルーム

くそーあなたは正しい。どうして私はそれを見逃すことができますか?この問題の修正を見つけたら教えてください。ありがとう
GameDev 2017

@HarryBloomの完璧な解決策を見つけられますか?
Hemang 2018

@Hemang完璧な解決策ではありませんが、うまくいくものを見つけました。ここに2番目の回答を追加しましたstackoverflow.com/a/49094282/1532838–
ハリーブルーム

3

私は通常、UIViewControllerのviewDidLoadで戻るボタンを追加または変更します。

そのようなものが機能するはずです:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

ビューを閉じるために呼び出される関数を変更して実装することを忘れないでください。

さらに簡単に、タイトルを変更するだけです。

self.navigationItem.leftBarButtonItem.title = "Back"

7
これは、左から右にスワイプして戻るためのiOSの組み込みサポートを壊し、IMHO、これを壊すアプリは本当に苛立たしいものです。
NRitH 2016年


2

私の最初の答えは部分的にしか機能しないため、ここに2番目の答えを追加します。このメソッドは、アプリケーションの各ビューでメソッドを呼び出す必要があるという点であまり洗練されていませんが、副作用なしで機能します。

したがって、最初に、戻るボタンのテキストを削除し、カスタムの戻るボタンを追加する関数を使用してUIViewController拡張クラスを作成します。

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

次に、viewDidLoad必要な各ViewControllerのでこの関数を呼び出すだけです。


2

簡単な解決策:

1番目のコントローラーから2番目のコントローラーをプッシュしているときに、self.navigationItem.title = ""viewWillDisappearに配置します。ます。2番目のコントローラーから戻るボタンのタイトルを非表示にします。

上記のステートメントは1番目のコントローラーのタイトルを非表示にしているため、戻ってきたときに1番目のコントローラーのタイトルが再び必要になります。そのために、1番目のコントローラーのviewWillAppearメソッドに1番目のコントローラーのタイトル追加しました

(1番目のコントローラーの)以下の方法を参照してください

    override func viewWillDisappear(_ animated: Bool) {
    self.navigationItem.title = ""
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}


2

Swift4.2の回答を更新

で作業するUIAppearanceことは問題を解決するためのよりクリーンな方法ですが、それはすべてにUIBarButtonItem明確なテキストを持たせることになります。ソリューションの改善されたバージョンは、UIBarButtonItemがに含まれているかどうかを確認することですUINavigationBar

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

2

iOS 14では、backButtonDisplayModeプロパティがUINavigationItemクラスに表示されるようになりました。したがって、戻るボタンのタイトルを削除するには、

navigationItem.backButtonDisplayMode = .minimal

viewDidLoad削除するviewControllerの関数で。

すべてのnavigationBarでそれを削除するために、スウィズリングテクニックを使用しました

import UIKit

private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
        if didAddMethod {
            class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

extension UIViewController {
    
    static func swizzle() {
        let originalSelector1 = #selector(viewDidLoad)
        let swizzledSelector1 = #selector(swizzled_viewDidLoad)
        swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
    }
    
    @objc open func swizzled_viewDidLoad() {
        if let _ = navigationController {
            if #available(iOS 14.0, *) {
                navigationItem.backButtonDisplayMode = .minimal
            } else {
                // Fallback on earlier versions
                navigationItem.backButtonTitle = ""
            }
        }
        swizzled_viewDidLoad()
    }
}

そしてapplication(_:didFinishLaunchingWithOptions:)電話で

UIViewController.swizzle()

1

上の作品スウィフト5

        self.navigationItem.backBarButtonItem?.title = ""

ディスプレイに表示されている現在のビューコントローラーではなく、次にプッシュされたビューコントローラーで有効になることに注意してください。そのため、非常に混乱します。

また、ストーリーボードを確認し、前のView Controllerのナビゲーション項目を選択してから、[戻る]ボタン(インスペクター)に何かを入力します。


1

異なるViewControllerで同様のコードをスウィズリングまたは複製するメソッドを使用したくない人のための簡単なソリューションがあります。

戻るボタンのタイトルを削除するには、UINavigationControllerサブクラスを作成し、pushViewController(_、animated :)メソッドをオーバーライドします。

final class CustomNavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {

        super.pushViewController(viewController, animated: animated)

        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = nil

        viewController.navigationItem.backBarButtonItem = backBarButtonItem
    }
}

1

iOS13のメソッド。

let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]

let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance

UINavigationBar.appearance().standardAppearance = navigationBarAppearance

0

理由はわかりませんが、iPhoneのプラスで戻るボタンのタイトルを非表示にする問題が見つかりましたが、プラスのないデバイスでは正しい

leftBarButtonItem.title = ""

だから私は簡単な方法を見つけました。自動レイアウトのNavigationViewControllerのNavigationBarでクリアする色合いの色が設定されています。アイコンやテキストタイルを色合いで使用すると、問題が発生する可能性があります。しかし、私の場合、私はそれをすべてとして使用しません。


0

これを使用するだけです:

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

したがって、viewDidLoadでこのメソッドを呼び出します。

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}

0

この拡張機能をUIViewControllerに追加してから、次のようにすべてのviewDidLoad()でこの関数を呼び出すことができます:self.updateBackButton()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

0

私のために働く解決策を共有したいと思います。また、ニーズや要件に基づいて調整することもできます。

私の場合、ストーリーボードを使用してCustomNavigationBarを指定していることに注意してください

Swift 4.2

class CustomNavigationBar: UINavigationBar {

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let topItem = topItem else { return }
        removeBackButtonTitle(for: topItem)
    }

    override func pushItem(_ item: UINavigationItem, animated: Bool) {
        removeBackButtonTitle(for: item)
        super.pushItem(item, animated: animated)
    }

    func removeBackButtonTitle(for item: UINavigationItem) {
        item.backBarButtonItem = UIBarButtonItem()
    }
}

0

以下のための作品スウィフト4.2

AppDelegateファイル内のコード行を使用してdidFinishLaunchingWithOptions

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)

これにより、戻るバーボタンのテキストが非表示になりますが、残念ながらナビゲーションバーのタイトルは中央に配置されません
Giorgio

0

Swift 4.2&5

コードの後半でイメージピッカーを使用している場合に副作用が発生するナビゲーションバーの色合いで遊ぶ代わりに。

以下のコードを使用してください:

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

最初のViewControllerから呼び出します。

self.awakeFromNib()

0

スイフト4,5

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

0

UIViewControllerwith override関数の拡張子を作成し、空のタイトルでawakeFromNib()作成UIBarButtonItemしてに与えるだけnavigation backBarButtonItemです。

extension UIViewController {

  open override func awakeFromNib() {
    let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarBtnItem
  }

}

0

以下のコードをいずれかに入力するUIViewcontroller extensionと、すべてのUIViewcontrollerバックテキストが非表示になります

open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }

0

viewDidLoad()

    let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarButtonItem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.