2011-11-22 21 views
8

Nella mia applicazione ci sono molti UIViewControllers con UINavigationControllers. Ci deve essere un pulsante "indietro" e una "casa" UIButton su UINavigationBar. Tutto questo funziona bene.Pulsante indietro personalizzato sulla barra di navigazione

Ma alcuni dei miei UIViewControllers hanno nomi lunghi e, a volte, è rimasto troppo poco spazio. Sto cercando di sostituire l'etichetta originale del pulsante "indietro" (mostra il titolo della vista precedente) con un costume "Indietro", ma qualunque cosa ho provato non ha funzionato:

// Title didn't change 
[self.navigationItem.backBarButtonItem setTitle:@"Back"]; 

// Action didn't set, no response from button (button didn't do anything) 
[self.navigationItem.leftBarButtonItem 
    setAction:self.navigationItem.backBarButtonItem.action]; 

E ho bisogno il pulsante "indietro" per avere uno stile simile a questa domanda: Draw custom Back button on iPhone Navigation Bar

+0

La risposta fornita nella domanda di riferimento non è sufficiente? –

+0

Imposta (= cambia) il titolo della vista precedente – SentineL

+0

possibile duplicato di [Come modificare il titolo del pulsante Indietro di UINavigationBar su "Indietro"] (http://stackoverflow.com/questions/8046622/how-to-change-the -title-of-the-uinavigationbar-back-button-to-back) – jrturton

risposta

6

Prova questa

UIBarButtonItem *backBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)]; 
[self.navigationItem setBackBarButtonItem:backBarBtnItem]; 

- (void)popViewController 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

che non ha funzionato. Posso rimuovere il solito pulsante indietro e aggiungere il mio, ma come renderlo simile al solito? – SentineL

+0

per questo è necessario aggiungere un pulsante personalizzato avente quell'immagine a forma credo ... [[UIBarButtonItem alloc] initWithCustomView: customButton]; –

+0

questo è il codice di un piccolo barbaro, ma credo che non ci sia altra soluzione ... Quindi, lasciaci essere un barbaro per un po ':) Grazie comunque per la risposta. – SentineL

50

provare quanto segue. Sarà sicuramente lavorare:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:buttonImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
    [customBarItem release]; 
} 

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

Assicurarsi di avere un'immagine pulsante con le dimensioni di una barra di navigazione di nuovo pulsante nel vostro cartella delle risorse con il nome back.png.

Sentiti libero se è necessaria qualsiasi altra assistenza.

+0

Trovo che sia possibile rendere indistinguibile il pulsante back personalizzato dal pulsante back di iOS stock impostando anche un'immagine per lo stato evidenziato, in questo modo: [button setImage: evidenziatoButtonImage forState: UIControlStateHighlighted]; –

+0

perché non posso aggiungere un titolo al mio pulsante back personalizzato con questo codice? '[button setTitle: @" Back "forState: UIControlStateNormal];' – ArVan

+0

La barra di navigazione ha il pulsante di tipo UIBarButton. È possibile creare elementi UIBarButton con contenuto personalizzato o creare elementi di sistema standard in base alle proprie esigenze. –

2

Se stai facendo questo in tutto il luogo come me, è meglio implementare la soluzione di Anil come una categoria:

@interface UIViewController (CustomBackButton) 

- (void) setCustomBackButton; 
- (void) back; 

@end 

@implementation UIViewController (CustomBackButton) 

- (void) setCustomBackButton 
{ 
    UIImage *buttonImage = [UIImage imageNamed:@"back.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:buttonImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); 
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
    self.navigationItem.leftBarButtonItem = customBarItem; 
} 

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

@end 
1

Più semplicemente:

UIBarButtonItem *barBtnItem = 
    [[UIBarButtonItem alloc]initWithTitle:@"Indietro" 
            style:UIBarButtonItemStyleBordered 
           target:self 
           action:@selector(pop)]; 
[barBtnItem setTintColor:[UIColor whiteColor]]; 
self.navigationItem.leftBarButtonItem = barBtnItem; 
7

target : personalizzazione di tutti pulsante indietro sul UINavigationBar a icona bianca

Passi: 1. in "didFinishLaunchingWithOptions" Metodo 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.in il metodo "viewDidLoad" della classe comune ViewController super:

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

Supponiamo di avere due controller - Controller1 e controller2. Controller2 viene premuto da Controller1. Quindi, prima di premere il controller2 sulla navigationController da Controller1

Controller2 *controller2 = [[[Controller2 alloc] init]autorelease]; 
self.navigationItem.hidesBackButton = YES; 

Ora, nel viewDidLoad: Metodo di controller2, aggiungere il seguente frammento

UIBarButtonItem *backBarButtonItem =[[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(goBackToAllPets:)]autorelease]; 
self.navigationItem.leftBarButtonItem = backBarButtonItem; 

e nel metodo backButtonClicked, è possibile eseguire i controlli si volere.

Problemi correlati