13

1. Passo: Creare un nuovo UIViewController:
- Xcode -> Nuovo file ... -> Cocoa Touch Class -> UIViewController
- Nome: MyViewControllerCome aggiungere un controller di navigazione con Interface Builder?

2. Fase: Drag and rilasciare un "controller navigazione" (UINavigationController) dalla libreria MyViewController.xib

alt text

3.Step: Sono sicuro, devo fare qualcosa per collegare correttamente il Navigation Controller, vero?

4.Step: tenta di avviare il nuovo View Controller come finestra di dialogo modale:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
NSLog(@"navContr: %@", myViewController.navigationController); 
[self.navigationController presentModalViewController: myViewController animated:YES]; 

Risultato: "navContr: nil"

5.Step: Potete vedere il nuova vista modale (MyViewController), ma non ci sono NavigationController e UINavigationBar.

Grazie mille per il vostro aiuto!


UPDATE 1:

6.Step: Ho stabilito un nuovo UIViewController (ViewNavi2) come "Root View Controller":
alt text

7.Step: Definisco un IBOutlet UINavigationController *navigationController nella classe MyViewController e configuro xib: Navigation Controller -> Connections -> Reference Outlet

Ma il mio controller di navigazione è ancora :-(nullo

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
NSLog(@"navContr: %@", myViewController.navigationController); 
// -> "navContr: nil" 
+2

[qui] (http://rdcworld-iphone.blogspot.in/2013/03/how-to-add-navigation-controller-in.html) è il semplice tutorial per aggiungere il controller di navigazione – swiftBoy

risposta

15

Desideravo anche includere il controller di navigazione nel file NIB, ma tutto ciò che la documentazione Apple diceva era che "non ottimale" "senza spiegare in realtà come farlo. Volevo che la mia finestra principale a schede richiamasse una finestra modale contenente i controlli di navigazione tipici senza definire il controller di navigazione a livello di programmazione. Condividerò come l'ho fatto.

Il tuo codice era molto simile al mio, come ho anche definito uno IBOutlet UINavigationController *navigationController in MyViewController. Da Interface Builder, ho semplicemente definito la mia vista nel controller della vista radice e impostato il proprietario del file -> visualizza la definizione di quella vista.

E allo stesso modo al codice, ho fatto quanto segue nella mia finestra padre:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[self presentModalViewController:myViewController animated:YES]; 

(. Chiedo presentModelViewController su di sé, non so il motivo per cui si doveva self.navigationController) Quando ho provato questo, il risultato è stato che la mia vista è stata caricata dal file NIB, ma mancava la barra di navigazione. Un'altra linea di codice in MyViewController risolto questo:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setView:myNavigationController.view]; 

} 

Tutto quello che sto facendo qui, è l'impostazione di vista di MyViewController per puntare a myNavigationController.view, che contiene tutto ciò che è stato definito nel file NIB, tra cui il controller di navigazione.

+1

Grazie mille per la tua grande risposta! Sono sicuro che questo aiuterà molte persone! :-) @tutto: per favore VOTA – Manni

+0

@Henry Ho provato a fare qualcosa di molto simile. Questo mi ha fatto risparmiare un sacco di lavoro. Grazie! – Besi

+0

Molto bella spiegazione. Grazie. –

0

Il codice successivo è non ti darà alcun oggetto valido.

NSLog(@"navContr: %@", myViewController.navigationController); 

Il motivo è perché navigationController proprietà di UIViewController only returns a navigation controller if the view controller is in its stack. This property is nil if a navigation controller cannot be found. Il controller vista non è nella pila del controller di navigazione. Ad ogni modo, non sono nemmeno sicuro se inizializzi correttamente il nostro controller di navigazione. Leggi qualche documentazione.

+0

Grazie per voi aiuto, anche! Sembra che "il controller della vista non sia nel suo stack". Sì, penso di non aver inizializzato correttamente il mio controller di navigazione. Ma come posso farlo in Interface Builder? Aggiorna la mia domanda, per favore guarda su "AGGIORNAMENTO 1". – Manni

+0

Inoltre, se la tua vista è nello stack del controller nav ma tu (auto) l'hai rilasciata da qualche parte che non dovresti avere, self.navigationController potrebbe essere nullo. Doh! – AndrewS

2

Guarda il modello in XCode per una "Applicazione basata su navigazione". (Nuovo progetto -> Applicazione basata su navigazione) Quindi aprire MainWindow.xib in Interface Builder. Anche se non è una vista, pensala come il viewcontroller che hai creato nel passaggio 1. Poi guarda il "Root View Controller" a cui fa riferimento l'ispettore e vedi come è collegato al pennino "Root View Controller" in l'ispettore Attributi e la classe "RootViewController" nell'Ispettore identità.

Vorrete mettere il contenuto che volete visualizzare alla radice della vostra navigazione nella versione di un "RootViewController". In genere, il controller che viene visualizzato successivamente è un "DetailViewController".Ancora una volta, leggi il codice di esempio fornito dal modello e vedrai come iniziare. Guarda il codice commentato in didSelectRowAtIndexPath nel modello di esempio di RootViewController.m. Sarà necessario creare il proprio controller di visualizzazione per servire come DetailViewController.

Speriamo che questo chiarisca le cose per voi.

// MODIFICHE basate sul tuo commento //
I documenti Apple dicono che se si desidera utilizzare IB per creare i propri controller di navigazione, è necessario inserirli realmente in MainWindow.xib. Stavo armeggiando con il fatto che non puoi avere il NavigationController come una sottoview del tuo oggetto UIView. Quello che puoi fare, dato da dove hai iniziato, è usare IB per aggiungere un oggetto barra di navigazione al tuo controller di visualizzazione e quindi controllare le cose da lì.

Dalla documentazione Apple "Anche se si potrebbe anche caricare stand-alone o controller di navigazione modale presentati dal file pennino principale (o qualsiasi altro file NIB), così facendo non è ottimale. In questi scenari, di solito è più facile creare la controller di navigazione a livello di codice nel punto di utilizzo. "

// MORE EDITS // In XCode4 il modello di progetto è ora denominato progetto "Dettagli principali". Questo perché verrà configurato come un controller di visualizzazione divisa in iPad, ma rimane comunque un normale progetto di navigazione in iPhone. Dove faccio riferimento a "RootViewController" nella risposta, ora troverai qualcosa chiamato "MasterViewController"

+0

Grazie mille per il tuo aiuto! Analizzo attentamente l'applicazione basata sulla navigazione. Sì, c'è un MainWindow.xib con un controller di navigazione funzionante. È collegato con AppDelegate, questa è l'unica differenza per MyViewController. Nel progetto modello, non è possibile vedere come MainWindow.xib viene inizializzato e forse il mio codice "MyViewController * myViewController = [[MyViewController alloc] initWithNibName: @" MyViewController "bundle: nil];" è sbagliato. Per favore guarda "AGGIORNA 1" nella mia domanda. – Manni

+0

Dalla documentazione di Apple "Sebbene sia possibile caricare anche controller di navigazione standalone o presentati in modo modale dal proprio file di pennini principale (o qualsiasi altro file di pennino), in questi casi è solitamente più semplice creare il controller di navigazione a livello di programmazione al punto di utilizzo. " – Walter

+0

Sì, hai ragione, sarebbe più facile creare il controller di navigazione a livello di codice, ma devo farlo con Interface Builder. Il motivo per cui puoi trovare qui: http://stackoverflow.com/questions/4604647/how-to-create-an-uiviewcontroller-with-uinavigationcontroller-with-interface-buil Hai ancora qualche idea per me? – Manni

Problemi correlati