2010-01-22 10 views
11

Mam UIViewController z własnym .xib, i chcę użyć UISegmentedControl do wyświetlania różnych informacji w dolnej połowie ekranu. Utworzyłem UIView w pliku .xib kontenera i połączyłem go z właściwością UIView o nazwie detailView w kontrolerze UIViewController.Ładowanie .xibs do UIView

Następnie utworzyłem trzy pliki .xib w IB, jeden dla widoku, który każdy segment musi wyświetlić w obszarze detailView.

Utknąłem, ponieważ nie wiem, jak załadować i wyładować odpowiedni plik .xib do obszaru detailView. Oto gdzie jestem:

- (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; 
    } 
} 

Więc jak mam wypełnić puste pola i wyładować/załadować detailView UIView prawidłowo?

Dzięki!

--UPDATE--

Kod w viewDidLoad jest: - (void) viewDidLoad { [bardzo 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); 
} 

a wiadomości debugger są:

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 

Dzięki!

Odpowiedz

24

Użyj NSBundle's loadNibNamed:owner:options:. Zwraca tablicę wszystkich obiektów najwyższego poziomu w pliku NIB, którą możesz następnie przypisać do twoich plików iv. Jeśli chcesz rozróżnić wiele obiektów w tablicy, podaj każdemu unikalny znacznik w IB.

Spróbuj tego:

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

Jeśli określony kontroler widoku jako plik Właścicielem dla AddressView.xib interfejs Builder i podłączeniu widok w XIb do gniazdka detailView kontrolera widoku, a następnie połączenie pomiędzy widokiem a self.detailView powinno być na miejscu po wywołaniu loadNibNamed (ponieważ podałeś siebie jako właściciela).

Jeśli to nie zadziała, spróbuj coś takiego:

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; 
... 

zrobić to samo dla wszystkich przypadków w instrukcji switch. Jeśli zadeklarowałeś detailView jako @property (retain), zadanie self.detailView = ... zajmie zwolnienie wszystkich wcześniej załadowanych widoków. Nie ma potrzeby specjalnego usuwania zawartości NIB.

+0

Nie jestem pewien, jak to połączyć. Czy muszę wywoływać 'loadNibNamed: owner: options:' dla każdego pliku .xib?Czy możliwe byłoby zobaczenie jakiegoś przybliżonego kodu, aby dowiedzieć się, jak to zrobić? Dziękuję bardzo! –

+0

Dodałem kod do mojej odpowiedzi. –

+0

Ole, dzięki za świetny kod! Jedynym problemem, na który napotykam, jest to, że kiedy wywołuję funkcję -loadNibNamed: owner: options, NIB jest nakładany na cały widok, który powinien znajdować się wewnątrz. Wygląda na to, że 'self.detailView = nibView;' nie zmienia rozmiaru załadowanego NIB, aby zmieścić się wewnątrz detailView, który został ustawiony w IB. Jakieś pomysły tutaj? Dzięki! –

1

Zasadniczo trzeba użyć UIViewController za initWithNibName robić to, co chcesz:

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

W swojej AddressView XIb ustaw klasy właściciela pliku do UIViewController. Klasa widoku powinna być niestandardową klasą AddressView.

W ten sposób można pozycjonować i zmieniać wielkość podglądu za pomocą głównego pliku XIB. Następnie użyj układu XIB wyroczni, aby rozmieścić elementy sterujące.