Подтвердить что ты не робот

Как уведомляется родительский контроллер представления, который является контроллером детского вида, удалил себя?

Контроллер детского представления удаляется следующим кодом в реализации контроллера дочернего представления:

- (void)commandFinishVC
{
    [ self.view removeFromSuperview];
    [ self removeFromParentViewController ];
}

Контроллер дочернего представления и его представление успешно удалены, но как родитель уведомляет об этом? -viewDidDisappear не вызывается и -viewDidUnload устарел.

Из примеров, которые я могу найти, всегда предполагается, что родительский контроллер представления является инициатором события, назначающего удаляемый ребенок, но (для меня) ребенок должен быть автономным в нем логикой для завершения.

Следует ли вызывать методы удаления, используя свойство self.parentViewController и используя в контроллере родительского представления что-то вроде следующего:

- (void)commandFinishVC
{
    [ childVC.view removeFromSuperview];
    [ childVC removeFromParentViewController ];
}
4b9b3361

Ответ 1

Да, ваш родительский контроллер должен обычно контролировать добавление и удаление дочерних контроллеров, поэтому ваш второй подход кажется более применимым. См. Раздел Реализация контроллера контейнера в Справочнике классов UIViewController.

Я подозреваю, что вы можете уйти от своего прежнего подхода, когда ребенок сам удаляется, но Apple согласуется в своей документации и сессии WWDC 2011 на Внедрение UIViewController Containment говорит, что контроллер контейнера несет ответственность за управление детьми.

Итак, в ответ на ваш вопрос о том, как ребенок информирует родителя о его удалении, для этого нет установленного протокола. Но это неудивительно, потому что предполагается, что родитель инициирует этот процесс. И в той мере, в которой ребенку необходимо инициировать этот процесс, документация предполагает, что родитель должен иметь открытый API для управления дочерними контроллерами.

Таким образом, хотя для дочернего объекта нет протокола, информирующего родителя, существует, однако, опубликованный API, с помощью которого родительские контроллеры сообщают детям, что они были перемещены/удалены. В частности, когда родительский контроллер удаляет дочерний элемент, он должен вызывать willMoveToParentViewController. В этой документации явно указано, что мы должны выполнить это уведомление:

Если вы реализуете свой собственный контроллер представления контейнера, он должен вызвать метод willMoveToParentViewController: контроллера дочернего представления, прежде чем вызывать метод removeFromParentViewController...

Таким образом, как описано в разделе Добавление и удаление ребенка в Руководстве по программированию контроллера просмотра, при удалении дочернего элемента мы должны:

[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];

Неудивительно, что документация для didMoveToParentViewController одинаково однозначна: когда вы добавляете дочерний контроллер, вы должны вызвать didMoveToParentViewController, когда анимация/переход (если есть ) готово. Я не знаю, что произойдет, если мы не будем называть эти два метода уведомления, но Apple говорит, что мы должны, и поэтому представляется разумным сделать это.