Lo storyboard gestisce molto bene i controller di visualizzazione contenitore incorporati, visualizzando i segui ai controller di visualizzazione figlio/radice in modo che le relazioni vengano visualizzate in modo chiaro. È anche interessante il modo in cui i controller di visualizzazione di bambini e genitori sono separati in scene diverse.
Se si vuole ottenere questo effetto nel proprio progetto, allora c'è un trucco che non è perfetto ma molto semplice.Nel mio esempio, supponiamo di avere un controller di visualizzazione contenitore che si comporta come un controller di barra di tabulazione con solo due schede, 'sinistra' e 'destra'. Voglio che una scena rappresenti il controller della vista genitore e due scene separate rappresentano sia il controller di visualizzazione figlio "di sinistra" sia il controller di visualizzazione figlio "giusto".
Anche se è impossibile, sarebbe bello se potessi creare IBOutlet
s dal controller della vista contenitore per i suoi figli in diverse scene, e poi quando il mio controller della vista contenitore viene visualizzata impostare le relazioni padre/figlio in base alle le regole descritte lo UIViewController documentation. Se avessimo riferimenti ai nostri controllori di vista figlio 'sinistra' e 'destra', allora potremmo impostare le relazioni senza problemi.
La soluzione standard a questo problema riferimento è quello di creare i riferimenti ai controller di vista bambino trascinando in Object
punti vendita in scena la vista del controllore contenitore, e specificando il loro tipo di classe come istanze delle classi controller della vista del bambino.
Al fine di tenere i bambini separati in scene diverse come i contenitori integrati Apple, tuttavia, useremo un trucco diverso. In primo luogo, supponiamo di avere le seguenti proprietà dichiarate nella nostra classe contenitore, ContainerViewController
:
@property (nonatomic, strong, readwrite) UIViewController *leftViewController;
@property (nonatomic, strong, readwrite) UIViewController *rightViewController;
Nel nostro storyboard, selezionare la scena che rappresenta il controller 'left' vista. Nell'ispettore attributi, impostare la proprietà identifier
del controller di visualizzazione su "cvc_leftViewController"
("cvc_" si riferisce a , ma in realtà l'identificatore può essere qualsiasi cosa si desideri). Fai lo stesso per la scena del controller della vista giusta, impostando il suo identificatore su "cvc_rightViewController"
.
Ora inserire il seguente codice nel 'viewDidLoad
metodo s:
if (self.storyboard) {
_leftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_leftViewController"];
_rightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_rightViewController"];
}
Quando ContainerViewController
viene caricato dallo storyboard, andrà afferrare il 'ContainerViewController
' e '' vista controllori destra e sinistra dalle loro rispettive scene e impostare i riferimenti a loro tramite le sue proprietà. Ora che hai il controllo delle istanze del controller della visualizzazione figlio, puoi impostare le relazioni genitore/figlio come preferisci. Per sapere come farlo correttamente, fare riferimento allo UIViewController documentation.
Questo trucco non è perfetto e presenta molti avvertimenti, ma se si sta attenti, è possibile farlo funzionare correttamente per il progetto.
Edit: Anche se questo è completamente inutile e non significa nulla, se davvero veramente vogliono avere i collegamenti di visualizzazione dello storyboard dal contenitore al vostro bambino view controller proprio come Apple integrato in contenitori, basta usare la mia il metodo sopra descritto e quindi impostato passa direttamente dalla scena contenitore alle scene figlio e semplicemente non esegue mai quelle seguite. Ora tutto funzionerà correttamente e sarà anche bello.
Stai utilizzando una procedura di incorporamento, che è una funzionalità di iOS 6. La mia domanda risale a novembre 2011. :-p –
Sì. Ho appena realizzato che sto lasciando il gatto fuori dalla borsa un po '. Ho cercato di installare sul telefono 5.1.1 di un cliente; niente da fare. –
Ora che iOS 6 è stato rilasciato, questa è la risposta corretta. – awolf