2013-08-19 11 views
9

Ich habe einen einfachen Test durchgeführt, um mehr über den Contact Controller zu erfahren.
Ich habe einen View-Controller, wo ich hinzugefügt/entfernt, um einen View-Controller mit zwei Tasten Aktion: willMoveToParentViewController und didMoveToParentViewController MethodendidMoveToParentViewController wird zweimal aufgerufen


-(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); 
} 

Wenn I-View-Controller


- (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]; 
} 

Klasse ProfileViewController erstreckt UIViewController und außer Kraft hinzufügen Ich habe die folgenden Protokolle:


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

Wenn ich View-Controller entfernen:


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

Ich mag wissen würde Warum didMoveToParentViewController zweimal aufgerufen wird?

Danke!

+0

Können Sie auch die Eltern anmelden? Ich vermute, dass es in einem dieser Fälle "Null" gibt, um anzuzeigen, dass Sie den vorherigen Controller verlassen. –

+0

Es ist ziemlich seltsam. Vielleicht sollten Sie einen Haltepunkt in die Methoden einfügen und den Stapel verfolgen. Ich denke jedoch, dass der 2. Aufruf von 'addSubview' und' removeFromSuperview' ausgelöst wird. – Sulthan

+0

Ich stieß vor kurzem auf das gleiche Problem. Der Aufruf von ** removeFromParentViewController ** vor ** removeFromSuperview ** scheint das Problem für mich behoben zu haben. Das ist merkwürdig, da die Apple-Beispiele es so konfigurieren, wie Sie es haben. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW3 –

Antwort

7

Ich hatte das gleiche Problem als auch. Darüber hinaus stellte ich fest, dass ich nur eine Nachricht hatte, wenn ich während ViewDidLoad den Child-View-Controller hinzufügte. Ich habe es behoben, indem ich den Anruf zu [super didMoveToParentViewController:] entfernt habe. Ich denke, das Problem hat mit dem Hinzufügen von untergeordneten Ansicht-Controllern zu tun, während der Rückruf von einer Schaltfläche aus erfolgt, aber ich bin nicht sicher, warum dies ein Problem verursachen sollte.

+2

Dies funktioniert. Ich kann mir nicht vorstellen, dass es die richtige Lösung ist, aber ich denke, dass Sie mit dem Hinzufügen von Child View-Controllern aus Rückrufen etwas anfangen können. – user

0

Man kann wiederholte Systemaufrufe von didMoveToParentViewController herausfiltern, indem man den aktuellen übergeordneten Ansichtscontroller überprüft. In diesem Fall können wir Super Call verwenden, wie es sein sollte.

- (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 
} 
Verwandte Themen