UINavigationBar pulsante indietro personalizzato senza titolo


231

Come posso personalizzare il pulsante di navigazione indietro in iOS 7 e versioni successive senza titolo? (cioè solo con la freccia)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Mi chiedo solo se hanno qualche self.backButtonItem;

O

qualcosa come questo?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
Puoi usare la risposta @hiroshi + la proprietà tintColor della barra di navigazione per creare chevron con colori personalizzati e senza titoli
Dmitry Zhukov,

Per coloro che hanno una barra delle schede e non si desidera il testo del pulsante Indietro, la correzione è: nel viewDidLoad () del TabBarController put: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style:. piano, bersaglio: zero, azione: zero)
Borzh

Risposte:


313

In realtà è abbastanza semplice, ecco cosa faccio:

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

Inserire questa riga nel controller della vista che sta spingendo nello stack ( il controller della vista precedente ). Il pulsante Indietro del controller di visualizzazione appena premuto mostrerà ora tutto ciò che hai inserito per initWithTitle, che in questo caso è una stringa vuota.


3
L'ho usato ma il titolo viene e scompare in modo animato ??
user1010819

7
Grazie Kyle! Ho cercato un modo per rinominare il pulsante Indietro predefinito in iOS 7. L'ho inserito nel mio prepareForSeguecontroller di visualizzazione e ha funzionato perfettamente.
yiwei

1
@ user1010819 Questo è il comportamento previsto, barButtonItems si animerà dentro e fuori quando si cambia controller di visualizzazione. Cosa stai cercando di realizzare?
Kyle Begeman,

1
@YiweiGao Nessun problema! È solo un'altra di quelle cose che se conosci il codice giusto, è piuttosto semplice! Sono contento che abbia aiutato!
Kyle Begeman,

3
Sento che questo necessita di un aggiornamento, non mostra proprio nulla in questo momento, la freccia non è lì per impostazione predefinita?
Mathijs Segers,

198

Ho trovato un modo semplice per rendere il mio pulsante indietro con la freccia singola iOS.

Supponiamo che tu abbia un controller di navigazione che accede a ViewA da ViewB. In IB, seleziona la barra di navigazione di ViewA, dovresti vedere queste opzioni: Titolo, Prompt e pulsante Indietro.

ViewA opzioni della barra di navigazione

ViewA opzioni della barra di navigazione

Il trucco è scegliere il titolo del pulsante Indietro del controller della vista del destino (ViewB) nelle opzioni del controller della vista precedente (View A). Se non si riempie l'opzione "Pulsante Indietro", iOS inserirà automaticamente il titolo "Indietro", con il titolo del controller della vista precedente . Quindi, è necessario riempire questa opzione con un singolo spazio.

Riempi lo spazio nell'opzione "Pulsante Indietro"

Riempi lo spazio nell'opzione "Pulsante Indietro"

Il risultato:

Il risultato:


Benvenuto in Stack Overflow . Se non lo hai già fatto, dai un'occhiata a ciò che siamo in tour e leggi alcuni articoli nel centro assistenza su come lavoriamo e alcune delle usanze della comunità qui. Se hai bisogno di aiuto con le funzioni del sito, non aver paura di cercare, quindi fai una domanda su Meta Stack Overflow (se non riesci ancora a trovare una risposta). Grazie e buona fortuna! Ad ogni modo, puoi pubblicare le tue immagini ora ... :)
Qantas 94 Heavy

53
funziona, basta prestare attenzione - è necessario impostare "Pulsante Indietro" per il controller precedente (ad es. per rootViewController nel controller di navigazione)
evfemist,

Assicurati di non avere "hidesBackButton" impostato su TRUE sull'elemento di navigazione in ViewA
shim

Mi sembra che funzioni se il titolo del controller di presentazione è abbastanza lungo - se si tratta di un titolo breve verrà invece utilizzato.
amergin,

1
per me funziona solo quando NavigationItem di ViewController sia di origine che di destinazione hanno Back Buttonimpostato un singolo carattere di spazio (cioè sia ViewA che ViewB)
dcestari

72

Usa solo un'immagine!

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

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


4
Con questa soluzione sembra perdere la funzionalità "scorri per tornare indietro".
j7nn7k,

16
navigationController?.interactivePopGestureRecognizer?.delegate = selffa il trucco per mantenere il gesto indietro
Victor Carmouze,

Ho cercato questa risposta, forse per tutta la vita, ovvero il selettore di azioni.
Des

29

iOS7 ha nuove regole di interfaccia, quindi è meglio mantenere almeno la freccia indietro quando si preme un UIView. È molto semplice cambiare il testo "indietro" a livello di codice. È sufficiente aggiungere questo codice prima di eseguire il push della vista (oppure preparForSegue se si utilizzano StoryBoards):

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

Ciò modificherà il testo "Indietro" predefinito, ma manterrà la freccia indietro in stile iOS7. Puoi anche cambiare il colore della tinta per la freccia indietro prima di premere la vista:

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

Spero che questo ti aiuti!


2
Funziona davvero bene e sembra migliore delle altre opzioni. Ad esempio, il titolo non deve mai essere ripristinato al valore precedente, a differenza di alcune delle altre risposte.
pr1001

26

Non devi fare molto. Puoi ottenere lo stesso risultato tramite lo storyboard stesso.

Basta andare sul controller di navigazione principale e dare uno spazio. Ricorda non al controller desiderato il pulsante Indietro senza titolo, ma al controller di navigazione principale.

Come da immagine qui sotto.  Funziona con iOS 7 e iOS 8


Ci ho provato, funziona. Ma non riesco ancora a cambiare il titolo nel codice.
Yu-Lin Wang,

Ha funzionato con XCode7, ma non funziona più in xCode8 -> ios10.X, ho usato il metodo
@iwasrobbed

Tutto il genio è semplice!
Illya Krit,

22

Mentre la risposta di Kyle Begeman fa totalmente il trucco, è abbastanza fastidioso avere questo codice in ogni controller di visualizzazione possibile. Ho finito con una UINavigationItemcategoria semplice . Attenzione, ecco i draghi! Scusa, intendo, vorticoso:

#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

1
Ho votato ma poi ho deciso di usare un trucco più semplice - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( fonte ) - potrebbe essere un po 'meno elegante, ma sfrigolare mi è sembrato eccessivo
dmur

2
Scherzi a tutti ... non passare, vai su qualsiasi altra soluzione. Implementa la soluzione @nicky pubblicata come categoria e non pensarci due volte. Questa è un'ottima soluzione riutilizzabile che può essere implementata a livello di app se aggiungi questo file Prefix.pch. Apple incoraggia a utilizzare le categorie per aggiungere metodi alle classi esistenti che dovresti sfruttare quando possibile.
Zmonteca,

Questa è la migliore soluzione secondo me, comunque il "method_exchangeImplementation" è un po 'pericoloso, dai un'occhiata a questo: modo giusto per sfrigolare e questa guida di swizzling NSHipster
Alessandro Orrù

@ AlessandroOrrù In questo caso particolare, questo dovrebbe essere sicuro perché il metodo swizzled è il metodo UINavigationItemmolto personale, non c'è ereditarietà. Ed _cmdè molto improbabile che sia coinvolto in un getter. Comunque, è un buon punto. Quindi, se avete uno di questi numerosi aiutanti frizzanti nel vostro progetto, assicuratevi di usarlo anche qui.
secondcitysaint,

21

EDIT: 2014-04-09: Quando ho guadagnato la reputazione, mi dispiace perché non uso più questo trucco. Consiglio la risposta di Kyle. Si noti inoltre che selfof self.navigationItem.backBarButtonItemnon è il controller di visualizzazione visualizzato sul pulsante Indietro, ma il controller di visualizzazione precedente deve essere ripristinato.

Se non è necessario avere il testo del titolo per il controller della vista precedente, basta riempire il titolo con una stringa vuota;

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

Ciò eviterà di mostrare "indietro" con chevron sul controller di visualizzazione push.

EDIT: Anche se usi un testo del titolo non vuoto, impostando il titolo del controller della vista precedente in viewWillAppear:opere, tranne il titolo può sfarfallare in un battito di ciglia quando viene visualizzato il controller della vista. Penso che "L'app di Twitter" sembra fare un trucco più sottile per evitare lo sfarfallio.


L'unico problema che ho avuto qui è stato che quando ho premuto la barra di navigazione per tornare indietro il titolo nella vista precedente diventa vuoto. Qualche modo per aggirare questo?
Alioo,

@Alioo Hai provato quello che ho citato nella riga "EDIT"?
Hiroshi,

20

Funziona, ma rimuoverà il titolo dell'elemento precedente, anche se tornerai ad esso:

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

Basta impostare questa proprietà sul viewDidLoadView Controller spinto.


17
Ciò rimuoverà il titolo dell'elemento precedente, anche se lo fai di nuovo. Non molto bene :(
Antzi il

Ho impostato il titolo del VC che spinge in viewWillAppearmodo che sia sempre impostato correttamente.
Guto Araujo,

@GutoAraujo Funziona ma il titolo riappare con 1 o 2 secondi di ritardo che rende UX non così buono.
fuiiii,

In xCode8 -> ios10.X questo sembra essere l'unico modo per affrontare il problema
LucioB

12

Ecco come lo faccio e il modo più semplice, funziona e più chiaro per farlo.

Funziona se incorporato Navigation Controller

Swift 3

In viewDidLoadaggiungo questo al View Controller vuoi che il pulsante Indietro sia solo una freccia.

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

La differenza tra questa e la risposta di @Kyle Begeman è che si chiama questo sul controller di visualizzazione che si desidera che il pulsante Indietro sia solo una freccia, non sul controller di visualizzazione dello stack di push.


7

Non hai accesso al backButtonItem di navigazione nel modo che desideri, devi creare il tuo pulsante Indietro come di seguito:

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

E fuori rotta:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

poi abbiamo perso la bella animazione sfumata avvenuta sul pulsante Indietro
Kiddo,

3
Hai bisogno di una maschera per transizioni fluide. "* Se desideri utilizzare un'immagine personalizzata per sostituire il gallone predefinito, devi anche creare un'immagine della maschera personalizzata. IOS 7 usa la maschera per far apparire il titolo della schermata precedente che emerge o che scompare nel gallone durante la navigazione transizioni ".
utente

3
@null perderai il gesto di scorrimento laterale di iOS 7!
Mazen Kasser,

@utente Ottengo l'immagine personalizzata ma il colore della tinta è blu per impostazione predefinita. Come posso ottenere nessuna tinta aggiunta? grazie
Mazen Kasser il

7

Target: personalizzazione di tutti i pulsanti Indietro suUINavigationBarun'icona bianca

Passaggi: 1. nel metodo "didFinishLaunchingWithOptions" di 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. nel viewDidLoadmetodo della superclasse comune 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
    }

Questo mostra un avviso "La versione implicita di SYSTEM_VESION _..." non è valida in C99.
Jayprakash Dubey,

7

SWIFT 4

Per coloro che desiderano creare pulsanti posteriori personalizzati e rimuovere il titolo, utilizzare il seguente codice all'interno del controller di visualizzazione che sta spingendo il nuovo:

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)

Per un uso più universale, procedi come segue:

  1. Creare una funzione universale come segue:

    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. Quindi utilizzalo nei controller di visualizzazione come segue:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

Un semplice hack da iOS6 funziona anche su iOS7:

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

Modifica: non utilizzare questo trucco. Vedi il commento per i dettagli.


6
Non usare questo trucco. C'è un bug nel codice Apple sui dispositivi a 64 bit che impedirà la visualizzazione delle viste modali quando si effettua un offset del titolo del pulsante a barra. Maggiori dettagli .
zh.

Bene, c'erano solo problemi sul dispositivo, non sul simulatore.
zh.

Questo hack non funziona più se creato con Xcode 9 / iOS 11. "<" apparirà troppo basso e vedrai vincoli rotti quando eseguito nel debugger.
T'Pol

3

puoi usare questo. Questo funziona perfettamente per me semplicemente aggiungendo un UIButtoncome custumview per il UIBarButtonItem.

Prova il codice qui sotto

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

3
tuttavia, questo disabiliterà il gesto di ritorno all'indietro in iOS 7
user102008

3

Crea un UILabelcon il titolo desiderato per il controller della vista principale e assegnalo al controller della vistanavigationItem.titleView .

Ora imposta il titolo su una stringa vuota e il controller della vista successiva che premi avrà un pulsante indietro senza testo.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

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

}

3

Tutte le risposte non risolvono il problema. Non è accettabile ripristinare il titolo del pulsante in ogni controller di visualizzazione e l'aggiunta di offset al titolo fa comunque spostare il titolo del controller di visualizzazione successivo a destra.

Ecco il metodo che utilizza il metodo swizzling, basta creare una nuova estensione per 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
    }
}
}

Pulsante Indietro sulla parola indietro, funziona alla grande: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel,

Cosa vuoi dire amico? La domanda era sulla rimozione del testo dal pulsante Indietro?
Jakub Wolanski,

1
Molte app e le stesse app di Apple dicono "<Indietro", quindi è bene attenersi allo standard. BigTakeAway e JustEat.
Mike Zriel,

2

Ho applicato il seguente codice in viewDidLoad e funziona:

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

Solo per aggiornare uso l'icona vettoriale


2

È possibile sottoclassare UINavigationController, impostarsi come delegato e impostare backBarButtonItem nel metodo delegato 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

2

Ripristina titolo vuoto

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

Cambia immagine indietro

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

1

Uso questa soluzione da iOS 5 o giù di lì senza problemi. Ho creato una funzione di utilità che chiamo nei miei controller di visualizzazione. Devi farlo in viewDidLoad o in qualsiasi altro momento successivo.

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 alcuni casi l'elemento di navigazione potrebbe già esistere, in altri casi deve essere creato. Ciò rappresenta entrambi i casi senza fare confusione con il titolo dell'elemento di navigazione. Ti permette di rimuovere il titolo semplicemente passando @"".


1
Questa è la risposta corretta Niente trucchi. Questo sta solo usando l'API iOS nel modo in cui doveva essere usato, per impostare il titolo. Impostalo su @ "" per rimuovere il titolo (testato e funziona bene).
n13,

1

L'unico modo che ha funzionato per me è stato:

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

AGGIORNARE:

Quando ho cambiato il flag di animazione segue in true (prima era falso), l'unico modo che funzionava per me era:

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

1

Se hai due ViewController (FirstVC, SecondVC) incorporati nel controller di navigazione e desideri che sia presente solo la freccia indietro in SecondVC.

Puoi provare questo nel ViewDidLoad di FirstVC

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

Quindi quando premi Push in SecondVC, vedrai che c'è solo la freccia indietro


1

Se si imposta tintColor Of NavigationBar, aggiungere un'immagine del pulsante Indietro personalizzata senza titolo in modo che il colore della tinta rifletta il colore dell'immagine. Segui questo link documentaion di Apple.

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


1

Ho scritto un'estensione per renderlo più semplice:

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

}

1

Puoi cambiare il titolo in @ "" dell'attuale ViewController su viewWillDisappear e, quando sta per mostrare di nuovo, reimposta il titolo su qualunque cosa fosse prima.

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

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

0

Nel metodo preparForSegue: del tuo primo ViewController imposti il ​​titolo di quella vista su @ "", quindi quando viene spinto la vista successiva verrà visualizzato il titolo di ViewController precedente che sarà @ "".

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

L'unico problema è che quando si preme il pulsante Indietro la vista precedente non avrà un titolo, quindi è possibile aggiungerla di nuovo su viewWillAppear:

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

Questa soluzione non mi piace molto ma funziona e non ho trovato altro modo per farlo.


Vedi la mia risposta per la soluzione corretta senza fare confusione con il titolo dell'elemento di navigazione.
Dima,

La tua soluzione mantiene la freccia indietro di iOS7? Ho provato qualcosa di simile ma ha rimosso la freccia.
Alejandro Figueroa,

Mantiene la freccia indietro in iOS 7, sì. In iOS 6 il passaggio in una stringa vuota (lunghezza 0) rimuoverà anche completamente il pulsante, quindi fare questo è davvero buono solo per iOS 7.
Dima

C'è una soluzione molto semplice. Vedi se la mia risposta funziona per te.
Guto Araujo,

0

Per aggiungere alla risposta di Thomas C sopra, a volte mettere un singolo spazio non funziona e devi continuare ad aggiungere spazi.

pulsante barra vuota

Saprai di avere successo quando vedi "Elemento pulsante barra -" in "Elemento di navigazione". È presente nella struttura del documento (Editor-> Mostra struttura del documento). Una volta che vedi l'immagine sopra, puoi eliminare alcuni spazi e vedere se funziona ancora.


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

Proprio come fa Kyle Begeman, aggiungi il codice sopra nel controller della vista principale. Verrà applicato tutto il controller della vista secondaria. Inoltre, aggiungendo questo in initWithCoder: metodo, è possibile applicare lo stile per i controller di visualizzazione radice in approcci basati su codice xib, storyboard o.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.