Entfernen des Titeltextes eines iOS UIBarButtonItem


198

Ich wollte den Text von der Schaltfläche "Zurück" von a entfernen UIBarButtonItemund nur den blauen Chevron in der Navigationsleiste belassen. Denken Sie daran, dass ich für iOS 7 entwickle. Ich habe verschiedene Methoden ausprobiert, einschließlich, aber nicht beschränkt auf:

Dies ist die Bildmethode, die mir nicht gefallen hat (das Bild sah fehl am Platz aus):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

Eine andere Methode, die ich ausprobiert habe, war diese, die einfach nicht funktionierte (nichts wurde angezeigt):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

Was ich erreichen wollte, sind so etwas wie die Zurück-Tasten in der iOS 7 Music App, die nur einen einzigen Chevron enthielten.

Vielen Dank.


Schauen Sie sich diese Antwort an stackoverflow.com/a/20300577/1589731
ayalcinkaya

Warum machen Sie sich kein Bild von Ihren Anforderungen? Und verweisen Sie es in leftBarButtonItem.
Vishal Sharma

Der Grund, warum ich die Bildmethode nicht verwendet habe, ist 1. Es ist sehr schwierig, ein perfektes Bild des Zurück-Buttons zu erhalten, und 2. Es wird eine Form von Fehlausrichtung mit dem Bild geben und es sieht nicht natürlich aus, und deshalb Ich habe mich an StackOverflow gewandt, um Hilfe zu erhalten, wie dies nativ erreicht werden kann.
Pan Ziyue

Antworten:


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

Anschließend können Sie den Titel des Zurück-Button-Elements entfernen.

Wenn Sie Storyboard verwenden, können Sie die Zurück-Schaltfläche des Inspektors für Navigationsattribute mit Leerzeichen festlegen.


95
Bei großen Titeln gibt es ein Problem: Sie werden nicht zentriert, sondern nach rechts
verschoben

11
Dies funktioniert nicht, wenn der Benutzer "Barrierefreiheit - Schaltflächenformen" aktiviert hat
Mikael Bartlett

22
Ich denke, das ist eine bessere Antwort:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
Benjamin

19
Jede Lösung mit magischen Zahlen ist eine schlechte Idee. Mit dem Push-to-Autolayout werden Größenklassen, Eingabehilfen usw., die konstante Werte wie diese verwenden, Sie sicherlich beißen.
Michael Peterson

3
Um Benjamins Kommentar zu verbessern, sollten Sie dies UIControlStateHighlightedebenfalls
festlegen

411

Verwenden Sie Folgendes, um den Titel der Zurück-Schaltfläche für einen Ansichts-Controller festzulegen, ohne dessen Titel zu ändern:

Ziel c:

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

Schnell:

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

Dies wird auf dem View Controller ausgeführt, den Sie sehen würden, wenn Sie auf die Schaltfläche "Zurück" klicken. Das heißt, anstatt '<Einstellungen' zu sehen, möchten Sie nur '<' sehen, dann würden Sie dies auf Ihrem SettingsViewController in Ihre einfügen init. Dann werden die Probleme des Titels nicht angezeigt, wenn Sie sich den View Controller selbst ansehen.


1
Ich weiß nicht, warum die andere Antwort als richtig markiert ist. Sie entfernt nur den Titel, damit der Zurück-Button einen "Titel" anzeigt, aber das ist überhaupt nicht der richtige Ansatz! Dieser sollte die richtige Antwort sein.
Pach

8
Auch für alle, die Swift verwenden, ist es navigationItem.backBarButtonItem = UIBarButtonItem (Titel: "", Stil: .Plain, Ziel: Null, Aktion: Null). Es ist nicht schwer, von Obj-C zu Swift zu konvertieren, aber ich werde Ihnen den Ärger ersparen
Zoyt

15
@BenjaminPiette rufst du dies auf dem UIViewController an, den du sehen würdest, wenn du den Zurück-Button drückst? Nicht der UIViewController, der die Zurück-Schaltfläche anzeigt.
DonnaLea

2
Was für eine elegante Lösung! Vielen Dank. Es fühlte sich einfach nicht richtig an, das Offset-Ding zu machen.
Hyd00

2
Diese Lösung funktioniert perfekt, wenn Sie diese Codezeile auf dem vorherigen Controller im Navigationsstapel schreiben.
Bohdan Savych

128

Wenn Sie Storyboards verwenden, können Sie zu Attributes Inspectorden ViewControllern gehen Navigation Item(klicken Sie auf Navigation Bar) und die Back ButtonEigenschaft auf "" (ein Leerzeichen) setzen. Dadurch wird der Titel der Zurück-Schaltfläche auf ein Leerzeichen gesetzt, sodass der Chevron sichtbar bleibt. Sie müssen sich nicht mit Code anlegen.

Beispielbild

Beachten Sie, dass hierdurch der Back ButtonTitel für die Zurück-Schaltfläche festgelegt wird, die zu dem View Controller wechselt, der von dem darüber geschobenen Button verschoben wurde, und nicht für den Back Button, der in diesem Controller angezeigt wird!


10
Ich wünschte, ich könnte dies weiter verbessern: "Beachten Sie, dass dadurch der Titel der Zurück-Schaltfläche für die Zurück-Schaltfläche festgelegt wird, die zu diesem Ansichts-Controller übergeht, der darüber geschoben wurde, und nicht für die Zurück-Schaltfläche, die darin angezeigt wird Regler!"
Jayson Lane

121

Dies funktioniert für mich, um nur den "hinteren" Chevron ohne Text anzuzeigen:

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

Legen Sie diese Eigenschaft im viewDidLoadView Controller fest, der die Navigationsleiste anzeigt, und es wird den Trick ausführen.

Hinweis: Ich habe es nur in iOS 7 getestet, was im Rahmen der Frage liegt.


33
Dies hat den Nebeneffekt, dass die Titelbezeichnung in der Mitte der Navigationsleiste entfernt wird.
Pwner

7
Legen Sie den Titel der Push-VC in 'viewWillAppear' mit derselben Eigenschaft fest. Auf diese Weise wird es nicht entfernt.
Guto Araujo

5
Ich habe diesen Code in -viewDidLoadden VC verschoben, damit ich den Back-Text nicht möchte. Was ich jedoch später herausfand, war, dass, wenn ich die 2. VC aus navigationControllerdem Titeltext platziere, kurz danach erscheint, nicht sofort. Ich denke, ein Video würde dies besser veranschaulichen, also hier ist es: Link
Pan Ziyue

1
Dies ist nicht die beste Antwort. Weitere Informationen finden Sie in der Antwort von andyleehao: [[UIBarButtonItem-Darstellung] setBackButtonTitlePositionAdjustment: UIOffsetMake (0, -60) forBarMetrics: UIBarMetricsDefault];
lmnbeyond

1
Dies ist die richtige Antwort gemäß der Dokumentation von Apple: "Wenn sich der Empfänger auf dem Navigationselementstapel befindet und an zweiter Stelle von oben steht - mit anderen Worten, verwaltet sein Ansichtscontroller die Ansichten, zu denen der Benutzer zurück navigieren würde - den Wert in dieser Eigenschaft wird für die Schaltfläche "Zurück" in der obersten Navigationsleiste verwendet. Wenn der Wert dieser Eigenschaft Null ist, verwendet das System die Zeichenfolge "Zurück" als Text für die Schaltfläche "Zurück". "
Raphael Oliveira

27

Wenn Sie den Titel der Schaltfläche festlegen, verwenden Sie @ "" anstelle von @ "".

--BEARBEITEN--

Ändert sich etwas, wenn Sie andere Saiten ausprobieren? Ich verwende den folgenden Code selbst erfolgreich:

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

backString ist eine Variable, die auf @ "" oder @ "Back" gesetzt ist, je nachdem, ob ich iOS 7 oder eine niedrigere Version verwende.

Zu beachten ist, dass sich dieser Code nicht im Controller für die Seite befindet, für die ich die Zurück-Schaltfläche anpassen möchte. Es befindet sich tatsächlich im Controller davor auf dem Navigationsstapel.


Hmm, iOS 7 scheint das nicht zu ändern. Es wird weiterhin "Zurück" als Titel verwendet. Wenn ich setLeftBarButtonItem:backButtonstattdessen setzen würde, wäre nichts da.
Pan Ziyue

1
Wenn dies der Fall ist und nichts passiert, wenn Sie den Titel auf etwas anderes setzen, müssen Sie wahrscheinlich versuchen, Ihren Code auf den übergeordneten Ansichts-Controller zu verschieben. Ich verwende den Code, den ich oben in meiner prepareForSegue-Methode gepostet habe.
Kamaros

27

Geben Sie hier die Bildbeschreibung ein

Manchmal ist es hilfreich, Dinge im Kontext zu sehen. Hier ist ein minimales Projekt, das den "Zurück" -Text verbirgt, aber dennoch den Pfeil zeigt.

Storyboard

Geben Sie hier die Bildbeschreibung ein

Es gibt einen Show-Übergang von der Schaltfläche "Show Second View Controller" zum zweiten View Controller.

Ich habe dem zweiten Ansichts-Controller auch ein Navigationselement hinzugefügt, damit es einen Titel hat. Dies ist optional. Die Zurück-Taste ist davon nicht betroffen.

Code

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
}

Alternative Methode (nur IB, kein Code)

Wählen Sie im Storyboard das Navigationselement für den ersten Ansichts-Controller (nicht den zweiten). Geben Sie einfach ein Leerzeichen für den Text der Zurück-Schaltfläche ein.

Geben Sie hier die Bildbeschreibung ein


Schlüsselkonzept, dass "für den ersten Ansichts-Controller (nicht den zweiten)" der Name des VC ist, zu dem Sie zurückkehren möchten, sodass es in der Verantwortung liegt, diesen Titel zu vergeben.
Buguibu

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

1
Sie können backItem anstelle von topItem verwenden. TopItem blendet den Titel aus, während backItem den Titel der Zurück-Schaltfläche ausblendet.
Ravi Ojha

2
Dies ist die einzige Lösung, wenn sich der childViewController in der Tiefe 2+ im untergeordneten Stapel des NavigationController befindet
Nathaniel,

2
Dadurch wird auch der Titel des vorherigen Ansichtscontrollers entfernt. In den meisten Fällen wird dies saugen
CalZone

11

Unter iOS7 hat Apple zwei neue Eigenschaften in UINavigationBar eingeführt: "backIndicatorTransitionMaskImage" und "backIndicatorImage".

Einfach einmal anrufen:

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

Es wird ein benutzerdefiniertes Bild anstelle des Standard-Chevron-Glyphen gerendert, wobei die Farbtonfarbe des keyWindow übernommen wird.

Und um den Titel zu entfernen, schlage ich Kamaros 'Antwort vor. Denken Sie daran, diesen Code auf dem View Controller aufzurufen, der Ihren neuen View Controller pusht. Entfernen des Titeltextes eines iOS UIBarButtonItem


So passen Sie die Farbtonfarbe an [[UINavigationBar-Erscheinungsbild] setTintColor: [UIColor whiteColor]];
Mazen Kasser

10

Ich hatte nicht viel Erfolg mit den bereitgestellten Antworten, aber ich fand eine wirklich einfache Lösung. In Ihrem Storyboard können Sie auf das Navigationselement Ihres UIViewControllers klicken und den Text der Zurück-Schaltfläche festlegen. Ich habe es auf ein einzelnes Feld gesetzt und es gab mir das Verhalten, das ich suchte.Geben Sie hier die Bildbeschreibung ein


10

Dies funktionierte bei mir in iOS10. Rufen Sie dies über viewDidLoad des View Controllers auf.

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

6

Eine einfache Lösung für dieses Problem, das sowohl unter iOS7 als auch unter iOS 6 funktioniert, besteht darin, die benutzerdefinierte Titelansicht in viewDidLoad festzulegen:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Dann können Sie in viewWillAppear: sicher anrufen

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

Da es sich bei Ihrer Titelansicht um eine benutzerdefinierte Ansicht handelt, wird sie beim Zurückschieben in den Navigationsstapel nicht überschrieben.


Ich brauchte nur den letzten Teil des Codes und nicht das leere UILabel. Ich habe [self.navigationItem.backBarButtonItem setTitle:@" "];viewWillAppear aufgerufen, aber es hat nicht mit Ansichten funktioniert, die nach dem Schließen einer modalen Ansicht angezeigt wurden.
Diziet

6

Eigentlich kann man das mit nur einem Trick machen:

Überschreiben Sie die UINavigationBarKlasse und fügen Sie diese Codezeile hinzu:

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

Initialisieren Sie dann Ihre UINavigationControllermit dieser benutzerdefinierten UINavigationBar-Klasse .. usw.UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

Hoffe das hilft


Das hat bei mir funktioniert. Obwohl es so aussieht, als ob die Push-Animation unter iOS 7 leicht stottert: Der Titel scheint Platz für die Zurück-Taste zu schaffen, zentriert sich dann, da es keine gibt.
Zekel

Ja, versuchen Sie, eine benutzerdefinierte titleView zu verwenden, anstatt das Navigationselement direkt festzulegen. Ich denke, das sollte Ihr Problem beheben.
rordulu

Diese Lösung ist fantastisch, da sie global für jede Navigationsleiste mit der Unterklasse gilt. Danke
Yetispapa

5

Mit DonnaLeas Antwort konnte ich etwas zusammenschustern. So erscheint die Lösung in meiner UIViewController-Unterklasse:

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
    }
}

Das Problem mit der ursprünglichen Antwort besteht darin, dass der Titel vom Controller entfernt wird, wenn Sie darauf zurückgreifen. Der Versuch, den Titel in viewWillDisappear zurückzusetzen, ist zu spät im Übergangsprozess. Dadurch wird der Titel wieder eingerastet, anstatt gut zu animieren. Der willMoveToParentViewController erfolgt jedoch früher und ermöglicht das korrekte Verhalten.

Vorsichtsmaßnahme: Ich habe dies nur mit einem normalen UINavigationController Push / Pop getestet. In anderen Situationen kann es zu zusätzlichem unerwartetem Verhalten kommen.


4

In der prepareForSegue: -Methode Ihres ersten ViewControllers setzen Sie diesen Ansichtstitel auf @ "". Wenn also die nächste Ansicht verschoben wird, wird der vorherige ViewController-Titel angezeigt, der @ "" lautet.

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

Das einzige Problem dabei ist, dass Ihre vorherige Ansicht keinen Titel hat, wenn Sie auf die Schaltfläche "Zurück" klicken. Sie können sie also in viewWillAppear erneut hinzufügen:

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

Ich mag diese Lösung nicht sehr, aber sie funktioniert und ich habe keinen anderen Weg gefunden, dies zu tun.



3

Keine der Antworten hat mir geholfen. Aber ein Trick hat es geschafft - ich habe gerade den Titel des Ansichts-Controllers gelöscht, der kurz vor dem Drücken gedrückt hat (wohin die Zurück-Taste geht).

Wenn die vorherige Ansicht keinen Titel hat, enthält die Zurück-Schaltfläche unter iOS 7 nur einen Pfeil ohne Text.

In viewWillAppearder Push-Ansicht habe ich den Originaltitel zurückgesetzt.


1
Hmm, dieser Trick funktioniert. Es sieht jedoch so aus, als würden die Wörter dort oben manchmal flackern. Keine sehr gute Lösung, aber dennoch eine gute. +1
Pan Ziyue

3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

Ich hatte das gleiche Problem und habe es so gemacht.

--BEARBEITEN--

Dies ist eine Lösung, wenn Sie den Titeltext aller UIBarbuttonItem wirklich entfernen möchten. Wenn Sie nur den Titel des Schaltflächenelements der hinteren Leiste entfernen möchten, gibt es keine einfache und bequeme Lösung. In meinem Fall habe ich, da ich nur wenige UIBarButtonItems habe, die Titeltext anzeigen müssen, nur die titleTextAttributes dieser spezifischen Schaltflächen geändert. Wenn Sie genauer sein möchten, verwenden Sie den folgenden Code, der nur die Schaltflächen der Navigationsleiste ändert:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

1
Dies funktioniert bei mir, aber Sie können den Text kurz sehen, wenn Sie zurückschlagen.
Diziet

3
@Diziet versuchen , das gleiche gilt für den Staat Zugabe UIControlStateHighlightedals auch
CoderPug

2
Dies funktioniert gut, aber es "verbirgt" auch alle anderen Schaltflächen, nicht nur die Zurück-Schaltfläche ... Irgendwelche Ideen, um dies zu lösen?
Urkman

3

Bei Verwendung der Unterklasse navigationControllerwird das "Zurück" entfernt.

Ich benutze dies, um es dauerhaft über die App zu entfernen.

//.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
[[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];

1
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu.
Alex

1 machen die gleiche Farbe wie die Navigationsleiste 2 machen die Textgröße klein genug, um den Titel nicht zu quetschen
Bill Xie

Ich habe Ihre Antwort überprüft. Sie sollten Ihre Antwort immer unterstützen.
Alex

2

Schaltfläche "Zurück" Titel der Navigationsleiste

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

2

Hier ist, was ich mir mache, was einfacher ist, den Titel der Zurück-Schaltfläche zu entfernen

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

2

Swift 3.1 Sie können dies tun, indem Sie die Delegate-Methode von UINavigationController implementieren. Der Titel wird nur mit der Schaltfläche "Zurück" ausgeblendet. Das Bild mit dem Zurückpfeil und die Standardfunktionalität werden weiterhin angezeigt.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

1

Sie können auch Folgendes verwenden:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

Das funktioniert bei mir


1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

1

Weltweit perfekte Lösung

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
}

Dumpest-Lösung von allen ... es nutzt auch Platz wie zuvor ... es ist gerade transparent geworden ...
Laszlo

Es entfernt den Text aus allen UIBarButtonItems der App
Mikel Sanchez

1

Ich erstelle eine benutzerdefinierte Klasse für UINavigationControllerund wende sie auf alle Navigationscontroller in meiner App an. Innerhalb dieser benutzerdefinierten UINavigationControllerKlasse setze ich den UINavigationBarDelegaten auf, selfsobald die Ansicht geladen ist.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

Dann implementiere ich die Delegate-Methode:

- (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;
}

Auf diese Weise ordne ich einfach allen meinen Navigationscontrollern meine benutzerdefinierte Klasse zu und lösche den Titel von allen Zurück-Schaltflächen. Und nur aus Gründen der Übersichtlichkeit habe ich den Titel für alle meine anderen Ansichts-Controller immer viewWillAppearso festgelegt, dass der Titel immer aktualisiert wird, bevor die Ansicht angezeigt wird (falls er durch solche Tricks entfernt wird).


1

Das Eingeben eines einzelnen Leerzeichens für das Navigationselement "Zurück" funktioniert !!


1
Dies ist eher als Kommentar als als Antwort geeignet.
Al Lelopath

1

Wenn Sie wie ich eine benutzerdefinierte Ansicht anstelle der verwenden UINavigationBarund mit der Zurück-Taste nicht weiterkommen, müssen Sie ein wenig arbeiten, was sich etwas unübersichtlich anfühlt.

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

Es scheint, als ob es nicht präsentiert wird, egal was es versucht, einen Titel zu zeigen. Dies bedeutet, dass es angezeigt und dann versteckt wird, bevor es gezeichnet wird und das Problem löst.


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

1

Ich habe eine sehr einfache Null-Konfigurationskategorie erstellt, um alle Titel der Zurück-Schaltfläche in unserer App auszublenden. Sie können sie hier überprüfen . Diese Frage wurde bereits beantwortet, kann aber für andere hilfreich sein.

BEARBEITEN:

.h Datei

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

.m Datei

#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);
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.