2009-06-04 7 views
18

Mi sono imbattuto in questo due volte.La visualizzazione modale occasionalmente nasconde la barra di navigazione

volte utilizzando la seguente riga di codice:

[self.navigationController presentModalViewController:aViewController animated:YES]; 

visualizza la vista, ma la barra di navigazione è quindi nascosto.

posso scrivere:

[self.navigationController setNavigationBarHidden:NO]; 

al mio cuore di contenuti, ovunque mi viene in mente senza alcun effetto.

Qualcuno si è imbattuto in questo?

sto facendo qualcosa di stupido?

risposta

38

No, mi sono imbattuto in questo pure. Il problema è che quando si presenta un controller di visualizzazione modale con una classe basata su UIViewController, non si estende la barra di navigazione del controller di navigazione chiamante sul modale. La vista modale copre l'intero schermo. Quello che ho dovuto fare per risolvere il problema era creare un UINavigationController e spingere la classe basata su UIViewController su di esso, e quindi presentareModalViewController all'istanza del controller di navigazione.

piace:

UIViewController *vc = [[UIViewController alloc] init]; 
UINavigationController *cntrol = [[UINavigationController alloc] initWithRootViewController:vc]; 
[self presentModalViewController:cntrol animated:YES]; 
[cntrol release]; 

Questo mi ha permesso di avere una barra di navigazione in alto.

Non sono sicuro che ciò aiuterà nel caso specifico, l'unica altra cosa che suggerirei è di replicare il comportamento del modale con un UIAnimation che si ferma 44px sotto la parte superiore del telefono. Ciò manterrebbe visibile la barra di navigazione originale.

+1

Oh uomo, sono stupido. Non avevo bisogno del controller di navigazione in alto, solo una barra degli strumenti, una barra degli strumenti. Grazie –

+0

A proposito, grazie per aver messo quella canzone nella mia testa per le ultime 5 ore. Mi sento come se fosse Natale. –

+0

L'ho passato in testa per molto tempo :-) –

1

Forse questo è ovvio, ma una volta che hai finito con la vista modale e vuole respingerlo, si dovrebbe fare qualcosa di simile nel tuo vc modale:

[parentController dismissModalViewControllerAnimated: YES];

Dove parentController è un riferimento al vc da cui viene presentata la vista modale.

+1

Mi basta fare [auto dismissModalViewControllerAnimated: YES]; e ha lo stesso effetto. – Jonny

+0

sì, hai ragione Jonny, forse per qualche altro problema io non lavoravo per me, chissà ....: P –

2

@HeatMiser mostra un ottimo modo per aggirare il "bug" che circonda l'impossibilità di visualizzare gli elementi nella barra di navigazione. Non sono sicuro, tuttavia, se questo è strettamente un bug in Presentazione, dal momento che le operazioni modali dovrebbero superare il tema dell'interfaccia della vista sottostante. Avere il tema dell'operazione modale imitare il tema dell'interfaccia utente sottostante va bene, ma il wrapping della vera vista modale con una vista di navigazione mi sembra sbagliato (oggetto vista extra solo per ottenere un po 'più di comportamento).

Invece, il seguente funzionato per me e dà lo stesso comportamento di "Nuovo Messaggio" fa nel programma di posta (su iPhone).

In IB, posizionare un UIToolBar nella parte superiore della schermata modale (imitando la barra di navigazione) con "Annulla" e "Salva" UIBarButtonItem e un pulsante flessibile Barra spaziatrice elemento in mezzo per ottenere i pulsanti per allineare sinistra e destra . Quindi, aggiungi un UILabel centrato su UIToolBar (The Font Helvetica, Bold, Size 18 appare in corrispondenza del titolo della barra di navigazione). Collega i pulsanti a IBAction sul UIViewController del modale e il gioco è fatto.

1

Se c'è un controller di navigazione attiva, allora si dovrebbe solo usare

[self.navigationController pushViewControllerAnimated: come];

per far scorrere un altro controller di visualizzazione, mentre si concede a se stessi e all'utente un'interfaccia utente coerente completa di supporto pulsante "automatico".

Una volta che il controller di navigazione è in uso, presentare un controller di visualizzazione modale dovrebbe essere fatto solo per ingrandire l'area utilizzabile sullo schermo. E poi, dovresti davvero usare un'animazione di fantasia per far sapere all'utente che ti stai allontanando dal "compito" o dai "passaggi" che il controller di navigazione stava incorporando.