web-dev-qa-db-ja.com

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

UIViewControllerを押すと、新しいUIViewControllerの戻るボタンにタイトルがあります。タイトルに多くのテキストが含まれている場合、iPhone 4sでは見た目がよくないので削除します。

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

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

68
jansma

戻る矢印が必要な場合は、次のコードを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)

PDATE 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)

だからあなたの問題が解決されているかもしれません。

ハッピーコーディング。

114
Nimit Parekh

Swift 3の仕事のような魅力

self.navigationController?.navigationBar.topItem?.title = " "
56
Mahesh Babu

AppDelegateファイル内のこのコード行をdidFinishLaunchingWithOptionsメソッドに使用して、バックボタンtitleを削除しています。

Swift 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)
48
Karthickkck

他のViewControllerが依存している場所からParent ViewControllerに移動するだけです。

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

Xcode 8とSwift 3.0を使用できます

self.navigationController?.navigationBar.backItem?.title = " "
7
Anit Kumar

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

enter image description here

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

Swift 3.0でこのコード行を使用しました

6
Kiran jadhav

この動作が必要なすべてのUIViewControllersおよびサブクラスのviewDidLoadにサブクラスを作成できます。

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

この方法により、コードを複製することなく、どのコントローラーにビヘイビアーを使用するかを選択できます。私のコントローラーは、前のコントローラーのタイトルではなく「戻る」と言う方が好きなので、ここでそのタイトルを設定します。

5
Connor

rordulu's answer here からインスピレーションを得て、このトリッキーな問題のすべてのケースを処理すると思われるカスタム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()
    }
}

これで、このNavigation Controllerとバーの組み合わせを使用するたびに、戻るボタンのテキストが表示されなくなります! ????

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

5
Harry Bloom

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

そのような何かが動作するはずです:

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

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

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

self.navigationItem.leftBarButtonItem.title = "Back"
3
pteofil

このコードを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)
3
Vivek

Swift 4.2の回答を更新

UIAppearanceを使用することは問題を解決するためのよりクリーンな方法ですが、すべてのUIBarButtonItemにクリアテキストが含まれることになります。ソリューションの改良版は、UIBarButtonItemUINavigationBarに含まれているかどうかを確認することです。

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

簡単な解決策:

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

上記の文は第1コントローラーのタイトルを隠しているため、戻ったときに再び第1コントローラーのタイトルが必要です。そのために、viewWillAppear 1番目のコントローラーの1番目のコントローラーにタイトルを追加があります。

(最初のコントローラーの)以下のメソッドを参照

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

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

スウィフト3:

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

私の最初の部分的にしか機能しないので、ここに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)
}

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

2
Harry Bloom

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
2
Abhishek Jain

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

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
reza_khalafi

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

leftBarButtonItem.title = ""

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

0
Vasily Avilov

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

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}
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
Md Rais

Swift 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)
0
veradiego31

私に合ったソリューションを共有したいと思います。また、ニーズと要件に基づいて調整できます。

私の場合、ストーリーボードを使用して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
ixi