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

Мой код работает отлично, хотя я удаляю последнюю строку. Может ли кто-нибудь помочь мне в этом?

заранее спасибо


person Arun    schedule 20.08.2015    source источник
comment
Эти методы просто используются для некоторых ситуаций. После/перед перемещением/удалением контроллера представления в/из контроллера представления. Если выступает add/push/remove/pop, вам не нужно его вызывать.   -  person tuledev    schedule 20.08.2015
comment
Удаление этих методов не показывает никаких изменений. То же самое и с их добавлением   -  person Arun    schedule 20.08.2015
comment
да. Это правильно. Этот метод ничего не делает. Просто вызов метода didMoveToParentViewController. Если вы не реализуете это, назовите это --> ничего не делайте.   -  person tuledev    schedule 20.08.2015
comment
Будет ли это что-то делать для управления памятью?   -  person Arun    schedule 20.08.2015
comment
Нет. Вы можете игнорировать это.   -  person tuledev    schedule 20.08.2015
comment
Так какой смысл их использовать, если аффекта нет, и их можно было бы игнорировать?   -  person Darius Miliauskas    schedule 01.12.2015


Ответы (2)


Эти методы используются, потому что это правило, которому следует следовать при добавлении или удалении дочернего контроллера представления. Перед добавлением дочернего контроллера представления сначала следует вызвать метод willMoveToParentViewController, а затем метод didMoveToParentViewController. При удалении дочернего контроллера представления из родительского контроллера представления эти методы должны вызываться в обратном порядке.

addChildViewController: автоматически вызывает [child willMoveToParentViewController:self]. Поэтому следует вызывать didMoveToParentViewController после addChildViewController:. Точно так же removeFromParentViewController: автоматически вызывает [child didMoveToParentViewController:nil]. Так что нужно звонить willMoveToParentViewController: перед removeFromParentViewController:

person Arun    schedule 24.08.2015

По сути, они не делают ничего, что можно было бы заметить в интерфейсе. «Однако любой подкласс позволяет их переопределять, поэтому, если вы их не вызовете, вы не сломаете голый UIViewController, но вы сломаете подклассы, которые на него полагаются (например: скажем, подкласс хочет освободить объект когда он удаляется из родительского контроллера представления, если вы не вызываете метод, он никогда не освободит объект)». как было объяснено в комментариях здесь.

person Darius Miliauskas    schedule 01.12.2015