2013-08-19 16 views
9

Ho effettuato un semplice test per ulteriori informazioni sul controller di visualizzazione contenuto.
Ho un controller di vista dove ho aggiunto/rimosso un controller vista utilizzando due pulsanti azione:didMoveToParentViewController chiamato due volte


- (IBAction)myInfoAddAction:(id)sender { 
    profileViewController = [[ProfileViewController alloc] init]; 
    [self addChildViewController: profileViewController]; 
    UIView *__view = profileViewController.view; 
    [self.view addSubview: __view]; 
    [profileViewController didMoveToParentViewController: self]; 
} 

- (IBAction)myInfoRemoveAction:(id)sender { 
    [profileViewController willMoveToParentViewController: nil]; 
    [profileViewController.view removeFromSuperview]; 
    [profileViewController removeFromParentViewController]; 
} 

Classe ProfileViewController estende UIViewController e override willMoveToParentViewController e didMoveToParentViewController metodi


-(void)willMoveToParentViewController:(UIViewController *)parent 
{ 
    [super willMoveToParentViewController: parent]; 
    NSLog(@"willMoveToParentViewController -> %@", self); 
} 

-(void) didMoveToParentViewController:(UIViewController *)parent 
{ 
    [super didMoveToParentViewController: parent]; 
    NSLog(@"didMoveToParentViewController -> %@", self); 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    NSLog(@"viewWillAppear -> %@", self); 
} 

-(void)viewDidDisappear:(BOOL)animated 
{ 
    NSLog(@"viewDidDisappear -> %@", self); 
} 

Quando aggiungo vista controllore , Ho ottenuto i seguenti registri:


willMoveToParentViewController -> <ProfileViewController: 0x8c52ea0> 
viewWillAppear -> <ProfileViewController: 0x8c52ea0> 
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0> 
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0> 

Quando rimuovo View Controller:


willMoveToParentViewController -> <ProfileViewController: 0x8c52ea0> 
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0> 
viewDidDisappear -> <ProfileViewController: 0x8c52ea0> 
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0> 

mi piacerebbe sapere perché didMoveToParentViewController viene richiamato due volte?

Grazie!

+0

Potresti registrare anche il genitore? Sospetto che sia "nullo" in uno di questi casi per indicare che stai lasciando il controller precedente. –

+0

È piuttosto strano. Forse dovresti inserire un breakpoint nei metodi e osservare la traccia dello stack. Tuttavia, penso che la seconda chiamata sia attivata da 'addSubview' e' removeFromSuperview'. – Sulthan

+0

Ho avuto di recente lo stesso problema. Chiamare ** removeFromParentViewController ** prima ** removeFromSuperview ** sembra aver risolto il problema per me. È strano vedere che gli esempi Apple lo configurano come tu hai. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW3 –

risposta

7

Ho avuto lo stesso problema pure. Inoltre, ho scoperto che quando ho aggiunto il controller della vista figlio durante viewDidLoad, avevo solo un messaggio. L'ho risolto rimuovendo la chiamata allo [super didMoveToParentViewController:]. Penso che il problema abbia a che fare con l'aggiunta di controller di visualizzazione figlio durante la richiamata da un pulsante, ma non sono sicuro del motivo per cui ciò dovrebbe causare un problema.

+2

Questo funziona. Non riesco a immaginare che sia la soluzione corretta, ma penso che tu stia facendo qualcosa con l'aggiunta di controller di visualizzazione figlio da callback. – user

0

È possibile escludere chiamate di sistema ripetute di didMoveToParentViewController controllando il controller di visualizzazione padre corrente. In questo caso possiamo usare la super chiamata come dovrebbe essere.

- (void)didMoveToParentViewController:(UIViewController *)parent { 
    [super didMoveToParentViewController:parent]; 

    if (parent == nil && self.parentViewController == nil) return; 
    if (parent != nil && self.parentViewController == parent) return; 

    // From here any code called once 
} 
Problemi correlati