Zrobiłem prosty test, aby dowiedzieć się więcej na temat kontrolera widoku zamkniętego.
Mam kontroler widoku gdzie dodany/usunięty kontrolera widoku za pomocą dwóch przycisków Działanie:didMoveToParentViewController wywołany dwukrotnie
- (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];
}
Klasa ProfileViewController
rozciąga UIViewController
i zastąpić willMoveToParentViewController
i didMoveToParentViewController
metody
-(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);
}
Kiedy dodać widok kontrolera , Mam następujące dzienniki:
willMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
viewWillAppear -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
Kiedy usunąć widok kontrolera:
willMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
viewDidDisappear -> <ProfileViewController: 0x8c52ea0>
didMoveToParentViewController -> <ProfileViewController: 0x8c52ea0>
Chciałbym wiedzieć, dlaczego didMoveToParentViewController
wywoływana jest dwa razy?
Dzięki!
Czy możesz również zalogować rodzica? Podejrzewam, że "nil" na jednym z tych przypadków wskazuje, że opuszczasz poprzedni kontroler. –
To dość dziwne. Może powinieneś umieścić breakpoint w metodach i obserwować śledzenie stosu. Jednak myślę, że drugie wywołanie jest wyzwalane przez 'addSubview' i' removeFromSuperview'. – Sulthan
Ostatnio wpadłem na ten sam problem. Wywołanie ** removeFromParentViewController ** przed ** removeFromSuperview ** prawdopodobnie naprawiło problem. To dziwne, ponieważ przykłady Apple konfigurują go tak, jak Ty. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW3 –