2010-01-22 19 views
11

Ho un UIViewController con il proprio .xib, e voglio usare un UISegmentedControl per visualizzare informazioni diverse nella metà inferiore dello schermo. Ho creato un UIView nel file .xib del contenitore e lo ho collegato a una proprietà UIView denominata detailView nel contenitore UIViewController.Caricamento .xib in un UIView

Ho quindi creato tre file .xib in IB, uno per la visualizzazione che ciascun segmento deve visualizzare nell'area detailView.

Sono bloccato perché non so come caricare e scaricare il file .xib appropriato nell'area detailView. Ecco dove sono:

- (void)segmentValueChanged:(id)sender { 
    switch ([sender selectedSegmentIndex]) { 
     case 0: 
      // Unload whatever is in the detailView UIView and 
      // Load the AddressView.xib file into it 
      break; 
     case 1: 
      // Unload whatever is in the detailView UIView and 
      // Load the ContactsView.xib file into it 
      break; 
     case 2: 
      // Unload whatever is in the detailView UIView and 
      // Load the NotesView.xib file into it 
      break; 
     default: 
      break; 
    } 
} 

così come faccio a riempire gli spazi vuoti e scaricare/caricare il detailview UIView correttamente?

Grazie!

--UPDATE--

Il codice in viewDidLoad è ora: - (void) {viewDidLoad [super viewDidLoad];

// Set the default detailView to be address since the default selectedSegmentIndex is 0. 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 

    self.detailContainerView.autoresizesSubviews = YES; 
    [self.detailContainerView addSubview:self.detailView]; 

    NSLog(@"self.view is %@", self.view); 
    NSLog(@"self.detailContainerView is %@",self.detailContainerView); 
    NSLog(@"self.detailView is %@", self.detailView); 
} 

E i messaggi di debug sono:

self.view is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190 
self.detailContainerView is UIView: 0x3a1aea0; frame = (20 57; 280 339); autoresize = W+H; layer = CALayer: 0x3a36b80 
self.detailView is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190 

Grazie!

risposta

24

Utilizzare NSBundle loadNibNamed:owner:options:. Restituisce una matrice di tutti gli oggetti di livello superiore nel file NIB, che puoi quindi assegnare ai tuoi ivars. Se è necessario distinguere tra più oggetti nella matrice, assegnare a ciascuno un tag univoco in IB.

Prova questo:

case 0: 
    [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    break; 
... 

Se è stato specificato il controller vista come proprietario del file per AddressView.xib in Interface Builder, e aver collegato la vista nel XIB alla presa detailview del controller della vista, allora la connessione tra la vista e self.detailView dovrebbe essere in posizione dopo la chiamata a loadNibNamed (perché hai specificato self come proprietario).

Se questo non funziona, provare qualcosa di simile:

case 0: 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 
    break; 
... 

fare lo stesso per tutti i casi in l'istruzione switch. Se hai dichiarato detailView come @property (retain), l'assegnazione self.detailView = ... si occuperà di rilasciare qualsiasi visualizzazione precedentemente caricata. Non è necessario scaricare in modo specifico il contenuto NIB.

+0

Non sono abbastanza sicuro di come metterlo insieme. Devo chiamare 'loadNibNamed: owner: options:' per ciascuno dei file .xib?Sarebbe possibile vedere qualche codice approssimativo per avere un'idea di come farlo? Grazie mille! –

+0

Ho aggiunto del codice alla mia risposta. –

+0

Ole, grazie per l'ottimo codice! L'unico problema che sto incontrando è che quando chiamo -loadNibNamed: owner: options il NIB è sovrapposto sopra l'intera vista in cui dovrebbe essere dentro. Sembra che 'self.detailView = nibView;' non ridimensiona la NIB caricata per adattarsi all'interno della detailView impostata in IB. Qualche idea qui? Grazie! –

1

Fondamentalmente è necessario utilizzare initWithnibName di UIViewController di fare ciò che si vuole:

UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"AddressView" bundle:nil]; 
[self.detailView addSubview:aViewController.view]; 
[aViewController release]; // release the VC 

Nella tua XI ter AddressView, impostare classe proprietario del file per UIViewController. La classe della vista deve essere la classe AddressView personalizzata.

In questo modo è possibile posizionare e ridimensionare la visualizzazione secondaria utilizzando il file xib principale. Quindi usa xib della sottoview per impaginare i controlli.

Problemi correlati