2012-04-13 17 views
55

Sto provando a creare un controller di visualizzazione contenitore utilizzando iOS5 e nuovi metodi come addChildViewController.Devo chiamare addSubview dopo aver chiamato addChildViewController?

Devo chiamare addSubview dopo aver chiamato addChildViewController?

Devo chiamare removeFromSuperview prima di chiamare removeChildViewController?

Non vedo nulla a riguardo nei documenti Apple. Cosa ne pensi?

risposta

40

Risposta breve: "Sì, sì". La gerarchia della vista e la gerarchia del controller della vista sono ancora indipendenti. L'API di contenimento consente semplicemente alle viste di altri controllori di presentarsi all'interno della visualizzazione di un controllore genitore in modo pulito e coerente.

È possibile trovare un po 'in Apple's docs here ... questo è un passaggio rilevante dai "View Controller container Disporre contenuto di altri controller di vista" sezione:

Un contenitore gestisce una gerarchia di vista altrettanto altra vista controllori Un contenitore può anche aggiungere le viste di uno qualsiasi dei suoi figli nella sua gerarchia di vista. Il contenitore decide quando viene aggiunta una vista di questo tipo e come deve essere ridimensionata per adattarsi alla gerarchia della vista del contenitore, ma in caso contrario il controllore della visualizzazione figlio rimane responsabile della vista e delle sue sottoview.

Se si ha accesso, mi raccomando check-out la WWDC 2011 Video dal titolo "Implementazione UIViewController contenimento" (watch in Safari | view in iTunes).

+1

Grazie mille.Se distruggo il contenitore, devo anche chiamare removeViewFromSuperview? O addirittura rimuovereChildViewController? – Ricardo

80

1) Devo chiamare addSubview dopo aver chiamato addChildViewController?

2) Devo chiamare removeFromSuperview prima di chiamare removeChildViewController?

Non proprio

Si dovrebbe chiamare removeFromParentViewController: invece di removeChildViewController: Si dovrebbe anche chiamare willMoveToParentViewController:

Per aggiungere/rimuovere, è possibile fare riferimento a questa grande categoria:

UIViewController + Container

- (void)containerAddChildViewController:(UIViewController *)childViewController { 

    [self addChildViewController:childViewController]; 
    [self.view addSubview:childViewController.view]; 
    [childViewController didMoveToParentViewController:self]; 

} 

- (void)containerRemoveChildViewController:(UIViewController *)childViewController { 

    [childViewController willMoveToParentViewController:nil]; 
    [childViewController.view removeFromSuperview]; 
    [childViewController removeFromParentViewController]; 

} 

Official resource at developer.apple.com

+1

Molto utile quella categoria. Molte grazie. – Ricardo

+0

Esattamente quello che stavo cercando! Grazie Peter –

+0

+1 La categoria è molto utile. Grazie. –

2

Aggiungendo alla risposta di Pietro: uno dei motivi che ho trovato per chiamare addChildViewController prima addSubview era che quando addSubview si chiama allora il viewDidLoad del bambino get chiama, e in alcuni casi si vuole avere la gerarchia padre-figlio correttamente istituito a quel punto. Se ciò non avviene, durante il child viewDidLoad la proprietà parentViewController sarà nullo.

Problemi correlati