DidMoveToParentViewController и willMoveToParentViewController
Документация Apple на UIViewController
гласит:
Если вы реализуете свой собственный контроллер представления контейнера, он должен вызвать метод willMoveToParentViewController:
дочернего контроллера представления перед вызовом метода removeFromParentViewController
, передав родительское значение nil.
Когда ваш пользовательский контейнер вызывает метод addChildViewController:
, он автоматически вызывает willMoveToParentViewController
: метод контроллера представления, который нужно добавить как дочерний элемент перед его добавлением.
Если вы реализуете свой собственный контроллер представления контейнера, он должен вызвать метод didMoveToParentViewController:
дочернего контроллера представления после завершения перехода на новый контроллер или, если переход отсутствует, сразу после вызова метода addChildViewController:
.
Метод removeFromParentViewController
автоматически вызывает метод didMoveToParentViewController:
дочернего контроллера представления после того, как он удаляет дочерний элемент.
Почему я должен вызывать эти методы? Что делают эти методы?
ProfileViewController *profile = [[ProfileViewController alloc] init];
profile.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:profile];
[self.view addSubview:profile.view];
[profile didMoveToParentViewController:self];
Мой код работает отлично, хотя я удаляю последнюю строку. Может кто-нибудь помочь мне в этом?
Ответы
Ответ 1
Эти методы используются, потому что это правило следует соблюдать при добавлении или удалении контроллера дочернего представления. Перед добавлением контроллера детского представления willMoveToParentViewController
следует сначала вызвать метод, а затем didMoveToParentViewController
. При удалении контроллера дочернего представления из родительского контроллера представления эти методы должны быть вызваны в обратном порядке.
addChildViewController:
автоматически вызывает [child willMoveToParentViewController:self]
. Поэтому после addChildViewController:
следует называть didMoveToParentViewController
. Аналогично removeFromParentViewController:
автоматически вызывает [child didMoveToParentViewController:nil]
. Поэтому следует называть willMoveToParentViewController:
до removeFromParentViewController:
Ответ 2
В принципе, они не делают ничего, что вы можете заметить в интерфейсе. "Тем не менее, любой подкласс позволяет им переопределять, поэтому, если вы их не назовете, вы не сломаете голый UIViewController, но вы будете разбивать подклассы, которые полагаются на него (например: говорят, что подкласс хочет освободить объект когда он удаляется из родительского контроллера представления, если вы не вызываете этот метод, он никогда не выпустит объект)." как было объяснено в комментариях здесь.