アイコンを保持したまま[戻る]ボタンからテキストを削除する


92

戻るボタンからテキストを削除したいのですが、アイコンは残したいのですが。私が試してみました

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

ただし、これによりテキストとアイコンは完全に削除されます。

回答:


98

@ rmd2の方法はほぼ正しいですが、代わりに、戻るボタンが指すコントローラーのナビゲーションバーを選択して、[ " "戻るボタン]フィールドに入力する必要があります。

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


1
最悪の場合、viewcontrollerにナビゲーションバーがない場合、テキストを削除するために追加する必要があります
Daniel Beltrami

142

私はこれがすでに答えを持っていることを知っていますが、コードでそれを行うこともできます(nibsで作業している場合)

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

上記を最初のView Controllerに追加します。

プッシュしているビューコントローラーごとにこれを行う必要があることに注意してください。したがって、3つのビューコントローラーがあり、それらすべてからバックテキストを削除する場合は、ビューコントローラー1と2に行を追加する必要があります。


5
これは、これまでに見た中で最も問題のない解決策です
lostAtSeaJoshua

4
.Plainに変更されました.plain。資本金なし
Gal

パーフェクト..!それが私が欲しいものです。
JD。

最良のソリューション。ありがとう。
Baran Emre 2017

1
GastónAntonioMontes@、それはiOS13の作業を行いますが、それは、直感的なビットカウンタです:空のタイトルbackBarButtonItemは、上で宣言しなければならないプッシュビューコントローラではなく、プッシュ 1
マーティン

49

多くを検索した後、私は最善かつ簡単な解決策を見つけました、これはSwift 4.2で記述され、Swift 5でも機能するすべてのviewControllersに影響します

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

ようこそ@ e.dimitrow
iOS Lifee

1
魅力のような作品
ジェリー・オカフォー

3
これは、ViewControllerがストーリーボードまたはニブに含まれている場合にのみ機能することに注意してください...
Nathaniel Blumer

1
天才的なソリューション!
WM

3
以前は機能していましたが、現在は機能していません(iOS 12シミュレータでは機能しますが、最新のiOS 13では機能しません)...
tanya

35

戻るボタンのテキストは、マスタービューのタイトルによって異なります。

トリックは、マスタービューが消えた場合はタイトルをクリアし、再度表示された場合は再度設定することです。

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "
}

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

33

プッシュされたビューコントローラーから戻るボタンのタイトルを削除したい場合は、subSettingsViewControllerで次のように言っ<Settings<ください。それから、SettingsViewControllerのviewWillDisappear()メソッドでbackBarButtonItemタイトルを設定する必要があります。

Objective-C:

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}

迅速:

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

1
.Plainに変更されました.plain。資本金なし
Gal

1
答えはsearchControllerの動作に合わせて更新する必要があります。たとえば、別のresultsVCを使用し、別のVCをプッシュするアイテムをタップした場合、最初のsearchControllerからのviewWillDisappearメソッドは呼び出されないため、タイトルはそのままです
H4Hugo

アプリ全体の画面のソリューションを探している場合、これは良い方法ではありません。-このコードを「ベースビューコントローラー」に追加すると、最初のビューコントローラーのviewWillDisappearが2番目のビューコントローラーのviewDidAppear(通常はタイトルを設定する)の後に呼び出されます。これにより、タイトルがめちゃくちゃになります。最善の方法は、[戻る]ボタンを上書きすることです
Mithra Singam 2018

完璧なソリューションのおかげで
SURESH SANKE

28

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

Swiftの場合

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

2
アプリのスタイルを単一のファイルに標準化し、アプリデリゲートから一度呼び出すことができるので、これが好きです
Aaronium112

4
それは本当に素晴らしくて速い解決法です、しかし...あなたが後ろのものを除いて他のバーボタンアイテムを持っているならばそれはトリッキーかもしれません
:)

3
1つの観察として、「。normal」属性のみを実装すると、クリックするとテキストが表示されます。「.selected」、「。highlighted」、および「.disabled」に同じ行を追加します。ちらつきのテキストが表示されないようにします。
Nick N

1
これには副作用があると思います。戻るボタン以外の他のバーボタンも影響を受け、明確なテキスト色になります:(
dhin

23

私の場合、カスタムアイコンとタイトルの場合、これでうまくいきました(Swift 4)

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

1
そのコードの最後の行は完璧に機能しました。他の提案はすべて機能しませんでした。おそらく、私のビューコントローラーがすべてnavコントローラーによって制御されているためです。その場合、navigationController?本当に必要です。
Salx

カスタムの戻るボタンを追加する場合は、上部の4行が必要です。そうでなければ、最後の行がトリックを行います。
Rafiqul Hasan

14

以前のViewControllerのStoryBoard Titleに ""を追加することで、この問題を解決しました。空ではなく単なるスペース; D

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


前の画面にタイトルを付ける必要があるので、私にはうまくいかないと思います。
lmiguelvargasf

2
タイトルを空白にしましたが、それでもタイトルは[戻る]ボタンのタイトルに表示されます
Himali Shah

1
タイトル、フィールドを空白にせず、戻るボタンフィールドに ""(スペース)を入力します
Kiril S.

13

ついに完璧なソリューションが見つかりました。

透明な画像を1つ追加し、AppDelegateに次のコードを追加するだけです。

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

1
これは間違いなく最良の答えです。私は以前、UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment他のほとんどの回答がお勧めするハックを使用していましたが、長いタイトルのビューコントローラーのiPhone Xでは壊れていました。このソリューションは問題なく機能します。
2018年

3
ベストアンサー。透明なテキストの色よりもうまくいきました。
ウィリアムT.

1
過去4年間に使用した最良のソリューション!あなたは一度に、一箇所で、そしてすべてのビューコントローラーに対してそれをします!!!
korgx9 2018

1
これをiOS 12で試したところ、テキストが画像の横に表示されました。:(
Sean McMains

13

迅速に4

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

おかげで、助けになりました(Swift 4.0、Xcode 10.1、iOS 12.1.1)、ありがとう
infinity_coding7

3
しかし、あなたは親vcでタイトルを失うでしょう
Wei Lu

1
大きなタイトルが存在する場合、topItemはlargeTitleです。動作しません
サランジス

10

スウィフト4+ にこれらの行を入れるAppDelegatedidFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

アプリデリゲートで外観を設定すると、すべてのUIBarButtonItemの前景色がクリアになりますね。テキストと一緒にUIBarButtonItemを追加する場合、このボタンの前景色を手動で変更する必要がありますか?
kuzdu

1
これは良いことですが、戻るボタンを押してもテキストは表示されます
ウィリアムT.

機能しますが、iOS 11では他のバーボタンを非表示にします。上記のRafiqul Hasanからの回答で問題を解決できます
huync

8

これは私のために働いています

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

正解です。iOS 13では、navigationItem.backBarButtonItemは機能しません。時間の節約になりました。ありがとう
マニッシュ

5

ViewControllerAがあり、ViewControllerBに移動する場合は、ViewControllerAで、新しいUIBarButtonItemを使用して現在のnavigationItemを設定し、別のビューコントローラーにプッシュする前にタイトルに空白の文字列を設定する必要があります。

タイトルを空白の文字列に設定します。デフォルト値はnilであるため、nilや ""(空の文字列)を設定することはできません

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

5

このコードを各VCに配置して、別のVCをプッシュします

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

3
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) {

    // Your code
}

3

ナビゲーションコントローラースタックのすべてのビューコントローラーから削除するには:

UINavigationControllerをサブクラス化し、これを追加します。

override func show(_ vc: UIViewController, sender: Any?) {
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)
}

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    setEmptyBackButton(viewController)
    super.pushViewController(viewController, animated: animated)
}

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

2

タイトルが長い場合、タイトルの色だけを変更しても機能しないことがあります。ナビゲーションバーのタイトルが左に移動する可能性があるためです。したがって、これを防ぐには、バーボタンのタイトルを水平に移動するだけでなく、透明にする必要があります。

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

1

私にとってこれはトリックをしました:

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

backBarButtonItem を変更せずにタイトルのみを設定すると、動作するように見えることに注意してください。ただし、ジェスチャーを使用して戻り、キャンセルしてプッシュされたビューコントローラーに留まると、バックタイトルが戻されます。

Swift 4での作業


説明してもらえますか?
mrc 2018

私は常に戻るボタンで戻るテキストを表示しているコントローラーを持っています。したがって、上記のコードは私のケースでは機能しません
Shahbaz Akram

1

コントローラのナビゲーションバーを選択して、[戻る]ボタンが指すFROMを選択し、[戻る]ボタンフィールドに「」と入力します。

たとえば、AコントローラーをBコントローラーにプッシュする場合は、Aコントローラーのナビゲーションバーに空白を入れます。


1

Xcode 10、Swift 4以降

ここで他の人への同様の答えですが、テキストがまだクリアされていない場合は、スペースをクリックしてからEnterキーを押す必要があることに注意してください。

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


1

詳細

  • Xcodeバージョン10.2.1(10E1001)、Swift 5

解決

1. UINavigationControllerのカスタムクラスを作成する

import UIKit

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

2. UIViewController拡張機能を追加する

import UIKit

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

3. ViewControllerクラスを更新します

import UIKit

class ViewController: UIViewController {
    override var navigationItemBackButtonTextIsHidden: Bool { return true }
}

完全なサンプル

import UIKit

// MARK: - ViewController

class ViewController: UIViewController {

    var screenCounter = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationItem()
    }

    override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}

extension ViewController {

    private func setupNavigationItem() {
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    }

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
        guard let navigationController = navigationController else { return }
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    }
}

// MARK: - NavigationController

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

// MARK: - UIViewController extension

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

結果

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


1

ViewControllers私のためにすべてをオーバーライドする1つの代替方法は、のを拡張UINavigationControllerして設定することbackBarButtonItemでしたtopViewController

Swift 5 Xcode 11.2.1の場合:

extension UINavigationController {
    override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let backButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        self.topViewController?.navigationItem.backBarButtonItem = backButton
    }
}

1

これをプログラムで行う最も簡単な方法はbackBarButtonItem、親のビューコントローラー(pushを呼び出すコントローラー)から設定することです。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

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

詳細はこちらhttps://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/


1

のデリゲートメソッドを使用して、戻るボタンからテキストを削除できますUINavigationController

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

}

extension CustomNavigationController: UINavigationControllerDelegate {
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
    }
    
}

0

Xcode 9.2のSwiftでは、次のように機能しました。

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

0

以前のビューコントローラーをまったく制御していない場合(つまり、フレームワークで作業している場合)、次のように[戻る]ボタンのタイトルを削除できます。

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

それが行うことは、ナビゲーションのスタックの最後の項目に移動し、そのバックタイトルを削除することです。ビューコントローラが表示されたら、必ず元のファイルを保存してください。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...
}

そして、それを再割り当てし、アプリのどの部分も中断しないようにします。

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}

0

これはあなたの問題を解決します:

    import UIKit

    extension UINavigationController{

    func customizeBackArrow(){
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    }
}

0

私はいくつかの答えを試しましたが、すべての場合にそれらを動作させることはできません。したがって、これが設定されている場合、ナビゲーションバーのタイトルに影響を与えないようにするための回避策です。

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }

0

不要な副作用のない簡単なプログラム的な方法は、ソースコントローラー(ナビゲート元のコントローラー)のawakeFromNibメソッドの空の項目で、navigationItem.backBarButtonItemを初期化することです。

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

注:viewDidLoad()メソッドのように、後で戻るボタンを初期化した場合は、スワイプバック失われます。機能ます(左端から右にスワイプすると、ナビゲーションスタックが1つ戻ります)。

次に、宛先コントローラーごとに異なる戻るボタンのテキストが必要で、セグエを使用している場合は、次のように、prepare(for segue :, sender :)メソッドでタイトルを設定できます。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let item = navigationItem.backBarButtonItem {
        switch segue.identifier {
        case "SceneOne": item.title = "Back"; break
        case "SceneTwo": item.title = "Home"; break
        case "SceneThree": item.title = nil; break // Use this scene's title
        default: item.title = "" // No text
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.