Ответ 1
Да, ваш родительский контроллер должен обычно контролировать добавление и удаление дочерних контроллеров, поэтому ваш второй подход кажется более применимым. См. Раздел Реализация контроллера контейнера в Справочнике классов UIViewController.
Я подозреваю, что вы можете уйти от своего прежнего подхода, когда ребенок сам удаляется, но Apple согласуется в своей документации и сессии WWDC 2011 на Внедрение UIViewController Containment говорит, что контроллер контейнера несет ответственность за управление детьми.
Итак, в ответ на ваш вопрос о том, как ребенок информирует родителя о его удалении, для этого нет установленного протокола. Но это неудивительно, потому что предполагается, что родитель инициирует этот процесс. И в той мере, в которой ребенку необходимо инициировать этот процесс, документация предполагает, что родитель должен иметь открытый API для управления дочерними контроллерами.
Таким образом, хотя для дочернего объекта нет протокола, информирующего родителя, существует, однако, опубликованный API, с помощью которого родительские контроллеры сообщают детям, что они были перемещены/удалены. В частности, когда родительский контроллер удаляет дочерний элемент, он должен вызывать willMoveToParentViewController
. В этой документации явно указано, что мы должны выполнить это уведомление:
Если вы реализуете свой собственный контроллер представления контейнера, он должен вызвать метод
willMoveToParentViewController:
контроллера дочернего представления, прежде чем вызывать методremoveFromParentViewController
...
Таким образом, как описано в разделе Добавление и удаление ребенка в Руководстве по программированию контроллера просмотра, при удалении дочернего элемента мы должны:
[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];
Неудивительно, что документация для didMoveToParentViewController
одинаково однозначна: когда вы добавляете дочерний контроллер, вы должны вызвать didMoveToParentViewController
, когда анимация/переход (если есть ) готово. Я не знаю, что произойдет, если мы не будем называть эти два метода уведомления, но Apple говорит, что мы должны, и поэтому представляется разумным сделать это.