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, но вы будете разбивать подклассы, которые полагаются на него (например: говорят, что подкласс хочет освободить объект когда он удаляется из родительского контроллера представления, если вы не вызываете этот метод, он никогда не выпустит объект)." как было объяснено в комментариях здесь.