2013-01-24 12 views
5

Ho una sottoclasse di UIViewController:Single UIViewcontroller, come passare tra più xibs?

@interface KBViewController : UIViewController 

con più xib s, per esempio, uno è un Qwerty e l'altro è Dvorak disposizione:

KBViewControllerQuerty~iphone.xib 
KBViewControllerDvorak~iphone.xib 

Così, quando l'utente clicca su un pulsante, Qwerty passa a Dvorak. Come puoi vedere, la logica del codice è identica per entrambi i layout di tastiera. Quello di cui ho bisogno è di ricaricare lo view con un altro xib.

Eventualmente, tutti i pulsanti nel Dvorakxib sarà ganci alle rispondono IBOutlet s in KBViewController.

Qual è il modo giusto per passare tra i due xib s?

+0

vuoi dire reinizializzare il controller della vista con diversi pennino? non penso sia possibile prova a sostituire quello vecchio con uno nuovo –

+0

Mi piacerebbe sostituire 'self.view' in 'KBViewController' e si spera che tutti i pulsanti nello xib' Dvorak' saranno agganciati al 'IBOutlet's di' KBViewController' che risponde. – ohho

risposta

6

Tutti i pennini è contrassegnato come File's Owner. Il collegamento IBOutlet e IBAction viene effettuato sulla base dello File's Owner. Pertanto, è possibile definire un controller di visualizzazione e due pennini, con il file File's Owner del file Nib impostato sul controller di visualizzazione definito.

Cioè, se si imposta File's Owner di tutti i file * KBViewController .xib a KBViewController e hanno un oggetto KBViewController da qualche parte si potrebbe caricare il KBViewController * .xib desiderato initWithNibNamed metodo (ricreare il controller della vista)

Se si dovrebbe mantenere lo stesso oggetto KBViewController per tutto il tempo, è possibile creare un oggetto KBViewController senza pennino. In KBViewController.m, attuare loadView e caricare manualmente l'oggetto UIView con il metodo -[NSBundle loadNibNamed] (caricare e modificare self.view a livello di codice).

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

Nota owner:self nel codice di cui sopra. Deve corrispondere a File's Owner di @ "SomeNibFile".

per cambiare immagine già caricata:

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

spiegazione più dettagliata: Resource Programming Guide - Loading Nib Files Programmatically

+0

Grazie! Questo ha funzionato alla grande. – SeanK

0

È possibile caricare manualmente il file del pennino e modificare l'attributo view del controller di visualizzazione o modificare qualsiasi visualizzazione desiderata, rispettivamente.

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

Il objectAtIndex:0 è corretto solo quando v'è un solo oggetto UIView radice nel file pennino

Dopo aver caricato la visualizzazione, è possibile impostare

self.view = someView; 

Naturalmente, se si dispone di un sottomenu nel tuo controller di visualizzazione, quindi puoi anche cambiarlo.

+0

aggancia i controlli nel nuovo pennino a 'IBOutlet' del controller di visualizzazione corrente? – ohho

+0

No, non credo, ma sarebbe possibile scrivere una sottoclasse 'UIView' per le KBViews e collegare ciascuna vista nei file xib a questa sottoclasse. Quindi, hai un 'UIViewController' con una vista della tua sottoclasse' UIView' ei controlli sono agganciati alla sottoclasse. Quando entrambi i file xib hanno gli stessi hook per la sottoclasse di 'UIView', allora dovrebbe funzionare come vuoi tu. – who9vy

Problemi correlati