2013-01-24 11 views
5

Mam podklasa UIViewController:Pojedyncze UIViewcontroller, jak przełączać się między wieloma Xibs?

@interface KBViewController : UIViewController 

z wieloma xib s, na przykład, jeden jest Qwerty a inny jest Dvorak układ:

KBViewControllerQuerty~iphone.xib 
KBViewControllerDvorak~iphone.xib 

Więc gdy użytkownik kliknij przycisk, Qwerty jest przełącznikiem na Dvorak. Jak widać, logika kodu jest identyczna dla obu układów klawiatury. Potrzebuję ponownie załadować view z innym xib.

Mamy nadzieję, że wszystkie przyciski w Dvorakxib będą haczyki do odpowiadających IBOutlet sw KBViewController.

Jaki jest właściwy sposób przełączania między dwoma xib s?

+0

masz na myśli ponownie zainicjować kontroler widok z innej stalówki? nie sądzę, że to możliwe. spróbuj wymienić stary na nowy –

+0

Chciałbym zastąpić 'self.zobacz 'in' KBViewController' i miejmy nadzieję, że wszystkie przyciski w 'Dvorak' Xib będą podpięte do odpowiadającego' IBOutlet's 'KBViewController'. – ohho

Odpowiedz

6

Wszystkie końcówki mają oznaczenie File's Owner. Łączenie IBOutlet i IBAction odbywa się w oparciu o File's Owner. Tak więc można zdefiniować kontroler widoku i dwie końcówki, z każdym plikiem File's Owner zestawu końcówek do zdefiniowanego kontrolera widoku.

Oznacza to, że jeśli ustawisz File's Owner wszystkim KBViewController * .xib plików do KBViewController i mieć obiekt KBViewController gdzieś można załadować KBViewController * .xib chcesz przez initWithNibNamed metody (odtworzenie kontrolera widoku)

If powinieneś cały czas utrzymywać ten sam obiekt KBViewController, możesz utworzyć obiekt KBViewController bez końcówki Nib. W KBViewController.m, implementuj loadView i ręcznie ładuj obiekt UIView metodą -[NSBundle loadNibNamed] (programowo załaduj i zmień self.view).

UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" 
                owner:self 
               options:nil] objectAtIndex:0]; 
self.view = someView; 

Uwaga owner:self w powyższym kodzie. Musi pasować do File's Owner z @ "SomeNibFile".

Aby zmienić już załadowany widok:

id superview = self.view.superview; 
[self.view removeFromSuperview]; 
UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" 
                owner:self 
               options:nil] objectAtIndex:0]; 
self.view = someView; 
[superview addSubview:self.view]; 

Bardziej szczegółowe wyjaśnienie: Resource Programming Guide - Loading Nib Files Programmatically

+0

Dzięki! To działało świetnie. – SeanK

0

Możesz ręcznie załadować swój plik nib i zmienić atrybut view kontrolera widoku lub zmienić odpowiednio dowolny widok.

UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" 
                 owner:self 
                options:nil] objectAtIndex:0]; 

objectAtIndex:0 jest tylko poprawne, gdy istnieje tylko jeden obiekt UIView korzeń w pliku nib

Po załadowaniu widoku można ustawić

self.view = someView; 

Oczywiście, jeśli masz subview w kontrolerze widoku, możesz to również zmienić.

+0

to powoduje przechwycenie kontrolek w nowym piku do 'IBOutlet'ów bieżącego kontrolera widoku? – ohho

+0

Nie, nie sądzę, ale byłoby możliwe napisanie podklasy 'UIView' dla twoich KBViews i powiązanie każdego widoku w twoich plikach xib z tą podklasą. Następnie masz 'UIViewController' z widokiem twojego podklasy' UIView', a kontrolki są podpięte do podklasy. Kiedy oba twoje pliki Xib mają takie same haki do twojej podklasy 'UIView', to powinno działać tak, jak chcesz. – who9vy

Powiązane problemy