У 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
. Це саме те, що я шукав. Не впевнений, як я пропустив це в документах.