2015-08-23 18 views
14

Ho un setup Storyboard con un UIViewController con una vista contenitore in modo da poter incorporare un altro UIViewController al suo interno.Incorpora UIViewController a livello di programmazione?

In un determinato scenario ho bisogno di cambiare il controller di visualizzazione incorporato. Nel mio storyboard non posso avere due segui dalla mia vista container (solo un singolo embed segue). Il che mi porta a farlo in modo programmatico.

Ho la vista del contenitore nello storyboard senza passaggi di incorporamento collegati.

Ora da questo punto, come posso incorporare a livello di codice l'oggetto UIViewController prescelto?

risposta

23

È possibile effettuare questa operazione a livello di codice, di seguito è il metodo che avrà un valore bool di prendere decisioni che View Controller devono essere aggiunti nella visualizzazione contenitore e poi sarà un'istanza di un oggetto e dopo che aggiungerà al containerView

- (void)addViewControllerToContainerView:(BOOL)addVC1 
{ 
// Get storyboard 
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"<name of storyboard>" bundle:[NSBundle mainBundle]]; 
    UIViewController *viewController = nil; 
    if (addVC1) 
    { 
// get viewController with identifier 
     viewController = [storyBoard instantiateViewControllerWithIdentifier:@"<View Controller 1 Identifier>"]; 
    } 
    else 
    { 
     viewController = [storyBoard instantiateViewControllerWithIdentifier:@"<View Controller 2 Identifier>"]; 
    } 
// lets add it to container view 
    [viewController willMoveToParentViewController:self]; 
    [self.view addSubview:viewController.view]; 
    [self addChildViewController:viewController]; 
    [viewController didMoveToParentViewController:self]; 
// keep reference of viewController which may be useful when you need to remove it from container view, lets consider you have a property name as containerViewController 
    self.containerViewController = viewController; 
} 

Quando è necessario rimuovere view controller dal controller della vista contenitore che si può fare questo

[self.containerViewController willMoveToParentViewController:nil]; // 1 
    self.containerViewController.view removeFromSuperView]; 
    [self.containerViewController removeFromParentViewController];//this line is updated as view is removed from parent view cotnroller istead of its viewcontroller is removed from parentViewController 
    self.containerViewController = nil 

Apple docs su controller di vista container

+0

Grazie per la risposta completa. Sfortunatamente non funziona come immaginavo. Innanzitutto, devo abilitare un 'UIViewController' all'interno di un' UIView' della radice 'UIViewController'. Questo riempie l'intera vista. In secondo luogo, se lo aggiungo come sottoview di 'UIView' (invece dell'intera vista VC), non è conforme ai vincoli di layout automatico come se fosse incorporato nello storyboard. –

+0

Questo approccio è realizzabile ed è per questo che esiste il concetto di controller di visualizzazione figlio e padre, quando si aggiungerà un controller di visualizzazione come controller di visualizzazione figlio si otterranno tutti gli altri metodi del ciclo di vita chiamati in child vc, e sicuramente anche AutoLayoutWill funzionerà . –

+0

Ho aggiunto il link a Apple docs che descrive come implementare i controller di vista contenitore –

Problemi correlati