2009-09-19 12 views
11

Ho un'app con 2 schermate (MainViewController e AboutViewController). Facendo clic su un pulsante, vorrei caricare la schermata AboutViewController, che è definita in un altro XIB.Come caricare un XIB?

Sembra semplice, ma non riesco a trovare il mio google-fu oggi. Come posso staccare questo?

risposta

30

Quando si chiama [AboutViewController init], ci si aspetta di chiamare qualche forma di [super init], che è sinonimo di [UIViewController init]. Quando ciò accade, il controller della vista cercherà automaticamente un file pennino chiamato (nel tuo caso) AboutViewController.xib. Se trova quel file, carica il contenuto nel tuo controller di visualizzazione per te.

Quindi, in pratica, è sufficiente inizializzare il controller di visualizzazione e accertarsi che abbia lo stesso nome del file pennino associato.

Se si desidera caricare un file di pennino con un nome diverso nel controller di visualizzazione, è possibile chiamare esplicitamente initWithNibName:bundle: con il nome di qualsiasi tipo di pennino desiderato.

Se l'init standard (con un file pennino con lo stesso nome) non funziona per voi, ci sono un paio di cose che è possibile controllare.

  • l'ortografia del nome della classe è la stessa come l'ortografia (e corpo) del file pennino
  • il file pennino è incluso nel progetto, e non solo seduti nella stessa directory
  • tua metodo init UIViewController di sottoclasse non anche chiamare [super init]
  • si sta chiamando metodo init tua UIViewController di sottoclasse
  • si sta effettivamente facendo vista del controller della vista visibile
+4

Non avevo idea XIBs erano automaticamente caricato come questo. Grazie! – DOOManiac

0

NSBundle loadNibNamed:

11

Con una schermata Informazioni su, probabilmente si desidera solo visualizzare una vista e quindi chiuderla. Quindi, piuttosto che usare un controller di visualizzazione completamente nuovo, puoi semplicemente coprire la vista corrente.

Dando per scontato che hanno un ivar

UIView *aboutUsView; 

con la proprietà appropriata.

Nel vostro controller della vista fare:

[[NSBundle mainBundle] loadNibNamed:@"AboutUsView" owner:self options:nil]; // Retains top level items 
[self.view addSubview:aboutUsView]; // Retains the view 
[aboutUsView release]; 

Per rimuovere la vista, dire in un'azione collegata a un pulsante sulla vista, fare:

[aboutUsView removeFromSuperview], aboutUsView = nil; // Releases the view 
+0

Ha detto in particolare che aveva due controller di vista, "MainViewController e AboutViewController", non un controller di visualizzazione e una vista. – mahboudz

+5

corretto. E in particolare ho detto che potrebbe non aver bisogno di entrambi per raggiungere il suo obiettivo dichiarato. –

+0

Questo sembra il metodo ovvio. – user1432813

Problemi correlati