Как работает View Controller Containment в iOS 5? - PullRequest
107 голосов
/ 05 декабря 2011

В сеансе 102 WWDC 2011 Apple представила View Controller Containment, которая представляет собой возможность создавать пользовательские контейнеры контроллера представления, аналогичные UITabBarController, UINavigationController и т. П.

Я смотрел примерынесколько раз.Есть множество методов, связанных с этим шаблоном, но было немного сложно точно их выяснить.Я опубликую здесь то, что, как мне кажется, происходит, и посмотрим, подтвердит ли сообщество или не подтвердит мои подозрения.

Сценарий 1: Переход от одного из родителей к новому родительскому контроллеру представления

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Должны ли первые две строки появляться в указанном порядке или они могут быть обращены?

Сценарий 2. Переход от контроллера родительского представления к родительскому представлениюконтроллер

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

Также необходимо позвонить [vc didMoveToParentViewController:nil]?Примеры в сеансе 102 не делали этого в этом сценарии, но я не знаю, было ли это упущением или нет.

Сценарий 3: переход от одного родительского представленияконтроллер к другому

Это, вероятно, произойдет следующим образом, потому что логика в каждом родительском контроллере представления будет инкапсулирована.

// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

Вопросы

Мой главный вопрос таков: в общем, должно ли работать удержание контроллера представления?Правильна ли приведенная выше механика?

Нужно ли звонить willMoveToParentViewController, прежде чем звонить addChildViewController?Это кажется мне логичным порядком, но это строго необходимо?

Нужно ли звонить didMoveToParentViewController:nil после звонка removeFromParentViewController?

Ответы [ 2 ]

73 голосов
/ 05 декабря 2011

В документах UIViewController достаточно ясно, когда и когда не вызывать willMove / didMove методы. Ознакомьтесь с документацией «Реализация контроллера представления контейнера» .

В документах сказано, что если вы не переопределите addChildViewController, вам не нужно вызывать willMoveToParentViewController: метод. Однако вам нужно вызвать метод didMoveToParentViewController: после завершения перехода. «Аналогично, контроллер контейнера-представления отвечает за вызов метода willMoveToParentViewController: перед вызовом метода removeFromParentViewController. Метод removeFromParentViewController вызывает метод didMoveToParentViewController: дочернего контроллера представления.»

Также здесь разработан пример здесь и пример кода здесь .

Удачи

22 голосов
/ 13 сентября 2013

Эта часть не верна:

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Согласно документам:

Когда ваш пользовательский контейнер вызывает метод addChildViewController :, он автоматически вызывает willMoveToParentViewController: метод контроллера представления, который будет добавлен как дочерний элемент перед его добавлением.

Так что вам не нужен [vc willMoveToParentViewController:self] звонок. Это делается автоматически, когда вы звоните [self addChildViewController:vc]. Вот снова пример кода:

[self addChildViewController:vc];
// [vc willMoveToParentViewController:self] called automatically
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

Для удаления контроллеров вида:

Метод removeFromParentViewController автоматически вызывает didMoveToParentViewController: метод контроллера дочернего представления после удаления дочернего элемента.

Предположительно, этот звонок [oldVC didMoveToParentViewController:nil].

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// [vc didMoveToParentViewController:nil] called automatically
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...