2011-06-06 11 views
11

così ho creato un UINavigationController manualmente, impostarlo come mio RootViewController di UIWindow, e vorrei usare un pulsante Indietro per uscire dalla UINavigationController e caricare un altro viewController nella sua posto. Tuttavia, il backItem proprietà della UINavigationBar è sola lettura, quindi non so come impostare correttamente (è in sola lettura e di default a zero nella visualizzazione di navigazione root). Come posso ottenere questo risultato (o un effetto simile, voglio essere in grado di "uscire" efficacemente da UINavigationController premendo il pulsante Indietro nella vista principale).Fare pulsante indietro per la vista radici in UINavigationController

In alternativa, questa è una cattiva forma? Come posso evitare la vista root di un UINavigationController?

EDIT:

Tentativo di Legolas' la soluzione con il seguente codice: (alcuni nomi sono stati cambiati)

UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:plvc]; // plvc being the first viewcontroller 
MyAppDelegate* appDelegate = [Utility getAppDelegate]; 
appDelegate.window.rootViewController = navController; 

UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Start" style:UIBarButtonItemStyleBordered target:self action:@selector(initializeStuff)]; 
navController.navigationItem.leftBarButtonItem = backButton; 
[navController.navigationItem setHidesBackButton:YES animated:YES]; 
[navController.view setNeedsDisplay]; 

ma il pulsante non viene visualizzato. Che cosa sto facendo di sbagliato? Gli altri pulsanti indietro vengono visualizzati correttamente, ma questo non funziona ancora.

+1

LOL. Cordiali saluti Ho copiato il tuo codice ESATTO e funziona! Vai al metodo ViewDidLoad della tua vista particolare. metti quelle tre cose che ho incollato. – Legolas

risposta

15

È possibile farlo in un approccio diverso.

passare al metodo:

- (void)viewDidLoad 

nascondere il pulsante indietro con

[self.navigationItem setHidesBackButton:YES animated:YES]; 

Creare un nuovo UIButton o un UIBarButtonItem, e posizionarlo al posto del pulsante indietro.

È quindi possibile utilizzare un'azione quando si fa clic sul pulsante

- (IBAction) clickBackButton : (id) sender; //and push view controller to your required view. 

Aggiornamento mia risposta: utilizzare questo nel metodo viewDidLoad // funziona come un fascino //

[self.navigationItem setHidesBackButton:YES animated:YES]; 
UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Start" style:UIBarButtonItemStyleBordered target:self action:@selector(initializeStuff)]; 

self.navigationItem.leftBarButtonItem = backButton; 
+0

Ok, ma non nascondendo il pulsante Indietro lo nascondiamo anche per le sottoview? Voglio usarlo lì, e mi piacerebbe solo uscire dalla vista radice –

+0

Non so come hai creato nuove viste in quanto non hai pubblicato alcun codice su come funziona l'app. Ma non penso che lo nasconderebbe per tutte le sottoview. Usa questa idea e crea questo pulsante solo per la vista che stai cercando di uscire. Non danneggerebbe provare [self.navigationItem setHidesBackButton: YES animated: YES]; in una vista e sperimentarlo :) – Legolas

+0

brb, testing :) –

0

provare DIS: -

UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStylePlain target:self action:@selector(initializeStuff)]; 
[self.navigationItem setleftBarButtonItem:leftBarButton]; 
[leftBarButton release]; 
3

Ci sono alcuni approcci a cui riesco a pensare.

  1. Utilizzare la propria icona "back button" del proprio progetto o un valore predefinito di sistema. Utilizzare leftBarButtonItem.
  2. Crea un'immagine dell'icona predefinita. Anche in questo caso, utilizzare leftBarButtonItem.
  3. Creare una vista radice falsa che si inserisce nello stack UINavigationController. L'unico scopo di questa vista di root sarà di lanciare la vista secondaria, o morire quando l'utente vi ritorna. In questo modo, non vedrai mai UINavigationController senza un pulsante Indietro. Ho provato questo (ma non lo ho profilato); l'impatto sulle prestazioni sembra trascurabile.

Inoltre, controllare < https://discussions.apple.com/message/8298537#8298537> dal 2008. Stessa domanda.

Il problema è: in che modo l'utente esce da un UINavigationController e torna all'app? La barra di navigazione di root non ha un pulsante indietro o alcun tipo di hook per uscire.

Al che qualcuno rispose:

di fare ciò che si vuole fare, il trucco è quello di mettere il controller "super-root" all'interno del controller di navigazione, ma ho impostato navigationBarHidden del controller nav proprietà a SÌ in viewWillAppear e NO in viewWillDisappear. (Per i punti bonus, animalo quando appropriato.)

Problemi correlati