2011-10-27 11 views
5

In un'applicazione iOS, come è possibile determinare se viene visualizzato un pulsante Indietro? Idealmente, mi piacerebbe sapere questo nel metodo loadView del mio controller.Come posso determinare se viene visualizzato un pulsante Indietro?

Ecco quello che ho provato in loadView, viewDidLoad, e viewWillAppear:

if (self.navigationItem.backBarButtonItem)

e questo:

if (self.navigationItem.leftBarButtonItem)

Nessuno di questi lavori - sono sempre pari a zero (l'espressione restituisce false), anche quando sullo schermo è presente un pulsante indietro. Quello che alla fine vorrei fare è impostare un pulsante Annulla come self.navigationItem.leftBarButtonItem, ma solo se non c'è alcun pulsante Indietro. Se è presente un pulsante Indietro, non è necessario il pulsante Annulla. Così com'è, l'impostazione di leftBarButtonItem sta ignorando il pulsante Indietro, quindi stiamo vedendo un pulsante Annulla tutto il tempo, anche quando dovrebbe esserci un pulsante indietro.

risposta

16

Stai chiedendo l'oggetto sbagliato per il suo backBarButtonItem. Questa proprietà controlla il modo in cui un oggetto viene rappresentato quando è l'elemento "indietro" nello stack di navigazione.

Pertanto, è necessario essere chiedendo al controller di vista a livello sotto dove siete nello stack di navigazione quello che il suo backBarButtonItem è:

int n = [self.navigationController.viewControllers count] - 2; 
if (n >= 0) 
    if ([(UIViewController*)[self.navigationController.viewControllers objectAtIndex:n]navigationItem].backBarButtonItem == nil) 
     // Do your thing.... 

Potrebbe essere necessario controllare se il controller di navigazione ha aggiunto il tuo viewController allo stack nel momento in cui stai eseguendo questo codice, il controller della vista superiore potrebbe essere ancora il precedente. Ho controllato in viewWillAppear e lo stack contiene il nuovo controller superiore a questo punto.

0

loadView è troppo presto. Il primo che potresti verificare è viewDidLoad. Potrebbe essere necessario attendere viewWillAppear.

+0

Grazie per la risposta. Ho appena provato entrambe le mie affermazioni "se" dalla domanda in viewWillAppear e ottengo gli stessi risultati: sono sempre sempre nulle e quindi non mi dicono cosa voglio sapere. –

+0

Assicurarsi che 'self.navigationItem' non sia' nil'. L'ultima cosa che potrebbe applicarsi è 'viewDidAppear'. Se non lo vedi lì, non ottieni l'oggetto giusto. –

+0

Grazie ancora. Ho verificato che 'self.navigationItem' non è nullo. Ho provato questo in 'viewDidAppear' e sto ancora ottenendo gli stessi risultati. –

3
NSLog(@"%@",self.navigationController.navigationBar.backItem); 
if (self.navigationController.navigationBar.backItem == NULL) { 
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(addLaunch)]; 
    self.navigationItem.leftBarButtonItem = cancelButton; 
    [cancelButton release]; 
} 

questo codice funziona, la sua nel viewDidAppear, se il controller è nullo, non c'è nessun tasto, così ho aggiungere il pulsante di annullamento, non è un articolo indietro, però, solo un normale:] Spero che questo aiuti

0

Cercare il seguente

self.navigationController.navigationBar.backItem 

invece di backBarButtonItem.

Se backItem esiste, ci si trova nello stack di spostamento oltre a rootViewController.

Problemi correlati