Visualizzazione dei controller di visualizzazione annidata iOS all'interno della visualizzazione di UIViewController?


88

In genere è una cattiva pratica di programmazione in iOS avere una vista del controller di visualizzazione annidata all'interno della vista di UIViewController? Supponiamo, ad esempio, che volessi avere una sorta di elemento interattivo che rispondesse ai tocchi dell'utente, ma occupasse solo il 25% dello schermo.

Suppongo che aggiungerei questo controller di visualizzazione annidato al mio UIViewController dicendo qualcosa come:

[self.view addSubview: nestedViewController.view];

6
Ecco un tutorial completo con molte immagini !! stackoverflow.com/a/23403979/294884 Godetevi
Fattie

Risposte:


145

No, questo è generalmente un buon design, aiuta a mantenere i controller di visualizzazione concisi. Comunque dovresti usare il pattern di contenimento del controller di visualizzazione, dai un'occhiata alla seguente documentazione.

Implementazione di un controller di visualizzazione del contenitore

Questo è incredibilmente semplice da configurare utilizzando Interface Builder anche con gli storyboard, dai un'occhiata alla vista contenitore nella libreria di oggetti.

Ecco un esempio artificioso in uno Storyboard. In questo esempio avresti 4 controller di visualizzazione, uno che contiene i 3 contenitori e uno per ogni contenitore. Quando presenti il ​​controller più a sinistra che ha tutti i contenitori, lo Storyboard si inizializzerà automaticamente e incorporerà gli altri 3. Puoi accedere a questi controller di visualizzazione figlio tramite la childViewControllersproprietà oppure esiste un metodo che puoi sovrascrivere prepareForSegue:sender:e catturare i controller di visualizzazione di destinazione di il segue sta per essere chiamato. Questo è anche un buon punto per passare le proprietà ai controller di visualizzazione figlio, se necessario.

inserisci qui la descrizione dell'immagine


40
come "diavolo" lo fai nello storyboard ?! è una domanda fondamentale .. Non conosco la risposta a :) Sigh - rispondendo alla mia stessa domanda. Aggiungi un contenitore alla scena. Dagli forma. Quindi sui campi vuoti dello storyboard creare un UIViewController. Quindi fare clic con il pulsante destro del mouse e trascinare da quel contenitore (nell'elenco Navigator o nella GUI) a quel nuovo UIViewController. Dal popup, scegli viewDidLoad-embed, per iniziare. Grazie Chris! :)
Fattie

Il collegamento è rotto, comunque.
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed" Holy cow: chi l'avrebbe mai detto!
Drux

Grazie @ChrisWagner! Questo è un pezzo fondamentale del puzzle per implementare l'architettura MVVM ed evitare Massive View Controller / "MVC";)
Rob

54

Ho inserito questo codice nel controller della vista genitore. Mi va benissimo.

Oggetto C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Un'altra opzione è usare IB e inserire la visualizzazione del contenitore. UIViewController verrà visualizzato automaticamente (XCode 9 in questo caso): inserisci qui la descrizione dell'immagine


2
Sì! +1. Grazie per aver incluso una risposta su come farlo in modo programmatico :)
C. Tewalt

Ho appena trascinato la vista dal controller della vista figlio all'elenco della sottoview principale.
dimpiax

5

Ecco la mia soluzione Swift 3 basata sulla risposta di Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.