UINavigationBar benutzerdefinierte Zurück-Schaltfläche ohne Titel

231

Wie kann ich die Navigationstaste in iOS 7 und höher ohne Titel anpassen? (dh nur mit dem Pfeil)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Ich frage mich nur, ob sie ein self.backButtonItem haben.

ODER

etwas wie das?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];
Kiddo
quelle
3
Sie können @hiroshi Antwort + Navigationsleiste tintColor Eigenschaft verwenden, um Chevron mit benutzerdefinierten Farben und ohne Titel zu machen
Dmitry Zhukov
Für diejenigen, die eine Registerkartenleiste haben und den Text der Schaltfläche "Zurück" nicht möchten, lautet der Fix: In viewDidLoad () des TabBarController setzen Sie: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style :. Ebene, Ziel: Null, Aktion: Null)
Borzh

Antworten:

313

Es ist eigentlich ziemlich einfach, hier ist was ich tue:

Ziel 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];

Swift 2

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

Swift 3

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

Fügen Sie diese Zeile in den Ansichts-Controller ein, der auf den Stapel verschoben wird ( den vorherigen Ansichts-Controller ). Die neu gedrückte Schaltfläche zum Zurücksetzen des View Controllers zeigt nun an, was Sie für initWithTitle eingegeben haben. In diesem Fall handelt es sich um eine leere Zeichenfolge.

Kyle Begeman
quelle
3
Ich habe das benutzt, aber der Titel kommt und verschwindet auf animierte Weise?
user1010819
7
Danke Kyle! Ich habe nach einer Möglichkeit gesucht, die Standard-Zurück-Schaltfläche in iOS 7 umzubenennen. Ich habe dies in meinen prepareForSegueView-Controller eingefügt und es hat perfekt funktioniert.
Yiwei
1
@ user1010819 Dies ist das erwartete Verhalten. barButtonItems wird beim Wechseln der Ansichtssteuerungen ein- und ausgeblendet. Was versuchst du zu erreichen?
Kyle Begeman
1
@ YiweiGao Kein Problem! Es ist nur eines dieser Dinge, dass es ziemlich einfach ist, wenn Sie den richtigen Code kennen! Ich bin froh, dass es geholfen hat!
Kyle Begeman
3
Ich habe das Gefühl, dass dies ein Update benötigt, es zeigt gerade nichts an, der Pfeil ist standardmäßig nicht da?
Mathijs Segers
198

Ich habe eine einfache Möglichkeit gefunden, meine Zurück-Schaltfläche mit einem iOS-Einzelpfeil zu erstellen.

Nehmen wir an, Sie haben einen Navigationscontroller, der von ViewB zu ViewA wechselt. Wählen Sie in IB die Navigationsleiste von ViewA aus. Die folgenden Optionen sollten angezeigt werden: Titel, Eingabeaufforderung und Zurück-Schaltfläche.

ViewA Navigationsleistenoptionen

ViewA Navigationsleistenoptionen

Der Trick besteht darin, in den Optionen des vorherigen Ansichts-Controllers (Ansicht A) den Titel der Zurück-Schaltfläche Ihres Schicksals-View-Controllers (ViewB) auszuwählen . Wenn Sie die Option "Zurück" nicht ausfüllen, setzt iOS den Titel "Zurück" automatisch mit dem vorherigen dem Titel des View Controllers. Sie müssen diese Option also mit einem einzelnen Leerzeichen füllen.

Füllen Sie die Option "Zurück" aus

Füllen Sie die Option "Zurück" aus

Das Ergebnis:

Das Ergebnis:

Thomás Calmon
quelle
Willkommen bei Stack Overflow . Wenn Sie es noch nicht getan haben, schauen Sie sich unsere Tour an und lesen Sie einige Artikel in der Hilfe über unsere Arbeitsweise und einige Bräuche in der Gemeinde. Wenn Sie Hilfe bei den Funktionen der Site benötigen, haben Sie keine Angst vor der Suche und stellen Sie eine Frage zu Meta Stack Overflow (falls Sie immer noch keine Antwort finden konnten). Danke und viel Glück! Wie auch immer, Sie können Ihre Bilder jetzt posten ... :)
Qantas 94 Heavy
53
es funktioniert, pass nur auf - du musst "Back Button" für den vorherigen Controller setzen (zB für rootViewController in deinem Navigations-Controller)
evfemist
Stellen Sie sicher, dass "hidesBackButton" für das Navigationselement in ViewA
shim
Es scheint mir, dass dies funktioniert, wenn der Titel des präsentierenden Controllers lang genug ist - wenn es sich um einen kurzen Titel handelt, wird er stattdessen verwendet.
Amergin
1
Für mich funktioniert es nur, wenn sowohl das Quell- als auch das Ziel-Navigationselement von ViewController Back Buttonauf ein einzelnes Leerzeichen (dh sowohl ViewA als auch ViewB) eingestellt sind
dcestari
72

Verwenden Sie einfach ein Bild!

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

[email protected]

Icon-Back @ 2x

[email protected]

Icon-Back @ 23x

mt81
quelle
4
Mit dieser Lösung scheinen Sie die Funktion "Swipe to Go Back" zu verlieren.
j7nn7k
16
navigationController?.interactivePopGestureRecognizer?.delegate = selfmacht den Trick, um die Geste des
Zurückwischens
Ich habe mein ganzes Leben lang nach dieser Antwort gesucht, nämlich nach dem Aktionswähler.
Des
29

iOS7 hat neue Schnittstellenregeln, daher ist es besser, mindestens den Zurückpfeil beizubehalten, wenn Sie eine UIView drücken. Es ist sehr einfach, den "Zurück" -Text programmgesteuert zu ändern. Fügen Sie einfach diesen Code hinzu, bevor Sie die Ansicht verschieben (oder prepareForSegue, wenn Sie StoryBoards verwenden):

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

Dadurch wird der Standardtext "Zurück" geändert, der Zurückpfeil im iOS7-Stil bleibt jedoch erhalten. Sie können auch die Farbtonfarbe für den Zurückpfeil ändern, bevor Sie auf die Ansicht klicken:

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

Hoffe das hilft dir!

Anibal Itriago
quelle
2
Dies funktioniert sehr gut und scheint besser als die anderen Optionen. Beispielsweise muss der Titel im Gegensatz zu einigen anderen Antworten niemals auf den vorherigen Wert zurückgesetzt werden.
pr1001
26

Sie müssen nicht viel tun. Sie können dasselbe durch das Storyboard selbst erreichen.

Gehen Sie einfach zum Root-Navigations-Controller und geben Sie ein Leerzeichen ein. Denken Sie nicht an den Controller, für den Sie die Zurück-Schaltfläche ohne Titel haben möchten, sondern an den Root-Navigations-Controller.

Wie im Bild unten.  Dies funktioniert für iOS 7 und iOS 8

Swaroop S.
quelle
Ich habe es versucht, es funktioniert. Aber ich kann den Titel im Code immer noch nicht ändern.
Yu-Lin Wang
Arbeitete mit XCode7, funktioniert aber nicht mehr in xCode8 -> ios10.X, ich habe die @ iwasrobbed-Methode verwendet
LucioB
Alles Genie ist einfach!
Illya Krit
22

Während Kyle Begemans Antwort völlig ausreicht, ist es ziemlich ärgerlich, diesen Code in jedem möglichen View Controller zu haben. Am Ende hatte ich eine einfache UINavigationItemKategorie. Vorsicht, hier sind Drachen! Entschuldigung, ich meine, swizzling:

#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
secondcitysaint
quelle
1
Ich stimmte zu, entschied mich dann aber dafür, stattdessen einen einfacheren Hack zu verwenden - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( Quelle ) - vielleicht etwas weniger elegant, aber das Zischen fühlte sich wie ein Overkill an
am
2
Im Ernst, Sie ... geben Sie keine andere Lösung weiter. Implementieren Sie die Lösung @nicky als Kategorie und überlegen Sie nicht länger. Dies ist eine großartige wiederverwendbare Lösung, die app-weit implementiert werden kann, wenn Sie diese Prefix.pch-Datei hinzufügen. Apple empfiehlt die Verwendung von Kategorien, um Methoden zu vorhandenen Klassen hinzuzufügen. Sie sollten dies nach Möglichkeit nutzen.
Zmonteca
Dies ist meiner Meinung nach die beste Lösung, trotzdem ist die "method_exchangeImplementation" etwas unsicher. Schauen Sie sich Folgendes an: Richtiger Weg zum Swizzeln und dieser NSHipster-Swizzling-Leitfaden
Alessandro Orrù
@ AlessandroOrrù In diesem speziellen Fall sollte dies sicher sein, da die Swizzled-Methode eine UINavigationItemsehr eigene Methode ist und keine Vererbung erforderlich ist . Und es _cmdist sehr unwahrscheinlich, dass es sich um einen Getter handelt. Trotzdem ist es ein guter Punkt. Wenn Sie einen dieser zahlreichen Helfer in Ihrem Projekt haben, stellen Sie sicher, dass Sie ihn auch hier verwenden.
Secondcitysaint
21

EDIT: 2014-04-09: Als ich an Ansehen gewonnen habe, tut es mir leid, weil ich diesen Trick nicht mehr benutze. Ich empfehle Kyles Antwort. Beachten Sie auch, dass die selfvonself.navigationItem.backBarButtonItem nicht der Ansichts-Controller ist, sondern die Schaltfläche Zurück angezeigt wird, sondern der vorherige Ansichts-Controller, der zurückgesetzt werden soll.

Wenn Sie keinen Titeltext für den vorherigen Ansichts-Controller benötigen, füllen Sie den Titel einfach mit einer leeren Zeichenfolge.

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

Dies verhindert, dass mit Chevron auf dem Push-View-Controller "zurück" angezeigt wird.

BEARBEITEN: Auch wenn Sie nicht leeren Titeltext verwenden, kann das Festlegen des Titels des vorherigen Ansichts-Controllers in viewWillAppear:Werken außer dem Titel blinken, wenn der Ansichts-Controller angezeigt wird. Ich denke, "The Twitter App" scheint subtiler zu hacken, um das Flackern zu vermeiden.

Hiroshi
quelle
Das einzige Problem, das ich hier hatte, war, dass der Titel in der vorherigen Ansicht leer wird, wenn ich auf die Navigationsleiste drücke, um zurück zu gehen. Wie kann man das umgehen?
Alioo
@Alioo Hast du versucht, was ich in der Zeile "EDIT" erwähnt habe?
Hiroshi
20

Dies funktioniert, entfernt jedoch den Titel des vorherigen Elements, auch wenn Sie darauf zurückgreifen:

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

Setzen Sie diese Eigenschaft einfach auf viewDidLoadden Push-View-Controller.

Guto Araujo
quelle
17
Dadurch wird der Titel des vorherigen Elements entfernt, auch wenn Sie darauf zurückgreifen. Nicht sehr gut :(
Antzi
Ich habe den Titel des Push-VC viewWillAppearso eingestellt, dass er immer richtig eingestellt ist.
Guto Araujo
@GutoAraujo Es funktioniert, aber der Titel erscheint mit einer Verzögerung von 1 oder 2 Sekunden wieder, was UX nicht so gut macht.
Fuiiii
In xCode8 -> ios10.X scheint dies der einzige Weg zu sein, um das Problem zu
beheben
12

So mache ich es und der einfachste, funktionierendste und klarste Weg, es zu machen.

Dies funktioniert beim Einbetten Navigation Controller

Swift 3

Wenn viewDidLoadich dies dem View Controller hinzufüge, soll die Schaltfläche "Zurück" nur ein Pfeil sein.

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

Der Unterschied zu @Kyle Begemans Antwort besteht darin, dass Sie dies auf dem View-Controller so aufrufen, dass die Zurück-Schaltfläche nur ein Pfeil sein soll, nicht auf dem Push-Stack-View-Controller.

r_19
quelle
7

Sie haben nicht wie gewünscht Zugriff auf das Navigations-BackButtonItem. Sie müssen Ihre eigene Zurück-Schaltfläche wie folgt erstellen:

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

Und natürlich:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}
Tarek Hallak
quelle
dann haben wir die schöne Ausblendanimation verloren, die auf dem Zurück-Button passiert ist
Kiddo
3
Sie benötigen eine Maske für reibungslose Übergänge. "* Wenn Sie ein benutzerdefiniertes Bild verwenden möchten, um den Standard-Chevron zu ersetzen, müssen Sie auch ein benutzerdefiniertes Maskenbild erstellen. IOS 7 verwendet die Maske, damit der Titel des vorherigen Bildschirms während der Navigation aus dem Chevron hervorgeht oder in diesem verschwindet Übergänge. "
Benutzer
3
@null Sie verlieren die Side-to-Side-Swipe-Geste von iOS 7!
Mazen Kasser
@user Ich erhalte das benutzerdefinierte Bild, aber die Farbtonfarbe ist standardmäßig blau. Wie kann ich keinen Farbton hinzufügen lassen? danke
Mazen Kasser
7

Ziel: Anpassen aller Zurück-Schaltflächen anUINavigationBarein weißes Symbol

Schritte: 1. in der Methode "didFinishLaunchingWithOptions" von AppDelete:

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.in der viewDidLoadMethode der gemeinsamen Superklasse 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
    }
Jagie
quelle
Dies zeigt eine Warnung "Implizite Version von SYSTEM_VESION _..." ist in C99 ungültig.
Jayprakash Dubey
7

SWIFT 4

Wenn Sie benutzerdefinierte Zurück-Schaltflächen erstellen und deren Titel entfernen möchten, verwenden Sie bitte den folgenden Code im Ansichts-Controller, der die neue Schaltfläche ausführt:

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)

Gehen Sie für eine universellere Verwendung wie folgt vor:

  1. Erstellen Sie eine universelle Funktion wie folgt:

    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. Verwenden Sie es dann in den View Controllern wie folgt:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
Nino Bouchedid
quelle
6

Einfacher Hack von iOS6 funktioniert auch unter iOS7:

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

Bearbeiten: Verwenden Sie diesen Hack nicht. Siehe Kommentar für Details.

zh.
quelle
6
Verwenden Sie diesen Hack nicht. Es gibt einen Fehler im Apple-Code auf 64-Bit-Geräten, der verhindert, dass modale Ansichten angezeigt werden, wenn Sie einen Titelversatz für Balkentasten vornehmen. Weitere Details .
zh.
Nun, es gab nur Probleme auf dem Gerät, nicht auf dem Simulator.
zh.
Dieser Hack funktioniert nicht mehr, wenn er mit Xcode 9 / iOS 11 erstellt wurde. Das "<" wird zu niedrig angezeigt und beim Ausführen im Debugger werden fehlerhafte Einschränkungen angezeigt.
T'Pol
3

Sie können dies verwenden. Dies funktioniert perfekt für mich, indem ich nur ein UIButtonals Custumview für das hinzufüge UIBarButtonItem.

Probieren Sie den folgenden Code aus

    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;
}
Abhilash Reddy Kallepu
quelle
3
Dies deaktiviert jedoch die
Rückwischgeste
3

Erstellen Sie eine UILabelmit dem gewünschten Titel für Ihren Root-View-Controller und weisen Sie ihn dem View-Controller zu navigationItem.titleView.

Setzen Sie nun den Titel auf eine leere Zeichenfolge und der nächste Ansichts-Controller, den Sie drücken, hat eine Zurück-Schaltfläche ohne Text.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
rounak
quelle
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];

}
Paresh Hirpara
quelle
3

Alle Antworten lösen das Problem nicht. Es ist nicht akzeptabel, den Titel der Zurückschaltfläche in jedem Ansichts-Controller zurückzusetzen. Wenn Sie dem Titel einen Versatz hinzufügen, wird der nächste Titel des Ansichts-Controllers weiterhin nach rechts verschoben.

Hier ist die Methode mit Methoden-Swizzling. Erstellen Sie einfach eine neue Erweiterung für 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
    }
}
}
Jakub Wolanski
quelle
Setzen Sie die Schaltfläche "Zurück" auf das Wort "Zurück", funktioniert hervorragend: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel
Was meinst du Kumpel? Die Frage war über das Entfernen von Text von der Zurück-Schaltfläche?
Jakub Wolanski
1
Viele Apps und Apple-eigene Apps sagen "<Zurück", daher ist es gut, sich an den Standard zu halten. BigTakeAway und JustEat.
Mike Zriel
2

Ich habe den folgenden Code in viewDidLoad angewendet und es funktioniert:

  // 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"]]];

Nur zum Aktualisieren verwende ich das Vektorsymbol

Hajra Qamar
quelle
2

Sie können UINavigationController in Unterklassen unterteilen, sich selbst als Delegat festlegen und das backBarButtonItem in der Delegatmethode festlegen 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
Nate Potter
quelle
2

Titel zurücksetzen leer

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

Bild zurück ändern

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

Ich benutze diese Lösung seit iOS 5 oder so ohne Probleme. Ich habe eine Dienstprogrammfunktion erstellt, die ich in meinen View Controllern aufrufe. Sie müssen dies entweder in viewDidLoad oder an einem beliebigen Punkt danach tun.

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

In einigen Fällen ist das Navigationselement möglicherweise bereits vorhanden, in anderen Fällen muss es erstellt werden. Dies berücksichtigt beide Fälle, ohne den Titel des Navigationselements zu beeinträchtigen. Sie können den Titel durch einfaches Übergeben entfernen @"".

Dima
quelle
1
Dies ist die richtige Antwort. Keine Tricks. Hierbei wird nur die iOS-API so verwendet, wie sie verwendet werden sollte, um den Titel festzulegen. Setzen Sie es auf @ "", um den Titel zu entfernen (getestet und funktioniert einwandfrei).
n13
1

Der einzige Weg, der für mich funktionierte, war:

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

AKTUALISIEREN:

Als ich das Segue-Animations-Flag in "wahr" geändert habe (es war vorher falsch), war der einzige Weg, der für mich funktioniert hat:

navigationController?.navigationBar.topItem?.title = ""
Siamaster
quelle
1

Wenn Sie zwei ViewController (FirstVC, SecondVC) in Navigation Controller eingebettet haben und möchten, gibt es in SecondVC nur einen Zurückpfeil.

Sie können dies in ViewDidLoad von FirstVC versuchen

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

Wenn Sie dann in SecondVC drücken, sehen Sie, dass es nur einen Zurückpfeil gibt

Yu-Lin Wang
quelle
1

Wenn Sie die tintColor Of NavigationBar festlegen, fügen Sie ein benutzerdefiniertes Bild mit der Schaltfläche "Zurück" ohne Titel hinzu, dessen Farbton die Bildfarbe widerspiegelt. Bitte folgen Sie diesem Apple Documentaion Link.

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 ];
Nazish Ali
quelle
1

Ich habe eine Erweiterung geschrieben, um dies zu vereinfachen:

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

}
Mark Bridges
quelle
1

Sie können den Titel in viewWillDisappear in @ "" des aktuellen ViewControllers ändern und den Titel bei erneuter Anzeige auf den vorherigen Wert zurücksetzen.

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

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

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.

Alejandro Figueroa
quelle
In meiner Antwort finden Sie die richtige Lösung, ohne den Titel des Navigationselements zu beeinträchtigen.
Dima
Behält Ihre Lösung den iOS7-Zurückpfeil bei? Ich habe etwas Ähnliches versucht, aber es hat den Pfeil entfernt.
Alejandro Figueroa
In iOS 7 bleibt der Pfeil nach hinten erhalten, ja. In iOS 6 wird durch Übergeben einer leeren Zeichenfolge (Länge 0) die Schaltfläche ebenfalls vollständig entfernt, sodass dies nur für iOS 7 wirklich gut ist.
Dima
Es gibt eine sehr einfache Lösung. Sehen Sie, ob meine Antwort für Sie funktioniert.
Guto Araujo
0

Um die obige Antwort von Thomas C zu ergänzen, funktioniert das Einfügen eines einzelnen Leerzeichens manchmal nicht und Sie müssen immer wieder Leerzeichen hinzufügen.

Leere Balkentaste

Sie werden wissen, dass Sie erfolgreich waren, wenn Sie "Balkenschaltflächenelement -" unter "Navigationselement" sehen. Das ist in der Dokumentübersicht (Editor-> Dokumentübersicht anzeigen). Sobald Sie das obige Bild sehen, können Sie einige Leerzeichen löschen und prüfen, ob es noch funktioniert.

Rog182
quelle
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; 
}

Genau wie Kyle Begeman fügen Sie den obigen Code auf Ihrem Root-View-Controller hinzu. Alle Unteransichts-Controller werden angewendet. Wenn Sie dies in der Methode initWithCoder: hinzufügen, können Sie den Stil für Root-View-Controller in xib-, Storyboard- oder codebasierten Ansätzen anwenden.

Chris So.
quelle