У WWDC 2011 Session 102, Apple представила View Controller Стримування, який є можливість створення користувацьких подань контролера контейнерів, аналогічно 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?
addChildViewControllerслід врівноважуватисьdidMoveToParentViewControllerіwillMoveToParentViewControllerбути врівноваженимremoveFromParentViewController. Це саме те, що я шукав. Не впевнений, як я пропустив це в документах.