Я просто окунаю ноги в первый раз в развитие iOS, и одна из первых вещей, которые мне пришлось выполнить, - это реализовать custom container view controller - позволяет назвать его SideBarViewController
- это своп из какого-либо из нескольких возможных контроллеров детского вида показывает, почти точно как стандартный Контроллер панели бара. (Это в значительной степени Tab Bar Controller но с Hideable стороны меню вместо панели вкладок.)Что на самом деле делает addChildViewController?
В соответствии с инструкциями в документации компании Apple, я называю addChildViewController
всякий раз, когда я добавляю ребенок ViewController к моему контейнеру. Мой код для подкачки из текущего контроллера вид ребенка показан с помощью SideBarViewController
выглядит следующим образом:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Тогда я начал пытаться выяснить только то, что addChildViewController
делает здесь, и я понял, что я понятия не имею. Помимо прикрепления нового ViewController
в массиве .childViewControllers
, он, похоже, не влияет ни на что. Действия и выходы из представления дочернего контроллера на дочерний контроллер, который я установил на раскадровке, все еще работают нормально, даже если я никогда не звоню addChildViewController
, и я не могу себе представить, что еще это может повлиять.
В самом деле, если я переписать свой код, чтобы не вызывать addChildViewController
, и вместо того, чтобы посмотреть, как это ...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... тогда мое приложение все еще работает отлично, насколько я могу сказать!
Документация Apple не проливает много света на то, что делает addChildViewController
, или почему мы должны это назвать. Весь объем соответствующего описания того, что метод делает или почему он должен быть использован в разделе в UIViewController
Class Reference есть, в настоящее время:
добавляет указанный контроллер представления, как ребенок. ... Этот метод предназначен только для того, чтобы вызывать реализацию пользовательского контроллера представления контейнера. Если вы переопределите этот метод, вы должны вызвать super в своей реализации.
Там же этот пунктом ранее на ту же странице:
Вашего контейнер-контроллер должен связать контроллер представления ребенка с собой, прежде чем добавить вид корня ребенка в иерархию представлений. Это позволяет iOS правильно маршрутизировать события в контроллеры дочерних представлений и представления, которыми управляют эти контроллеры. Аналогично, после удаления корневого представления ребенка из его иерархии представлений, он должен отключить этот контроллер детского представления от себя. Чтобы создать или разбить эти ассоциации, ваш контейнер вызывает определенные методы, определенные базовым классом. Эти методы не предназначены для вызова клиентами вашего класса контейнеров; они должны использоваться только для реализации вашего контейнера для обеспечения ожидаемого поведения сдерживания.
Вот основные методы, которые вы, возможно, необходимо позвонить:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
, но она не дает никакого понятия о том, что «события» или «ожидаемое поведение сдерживания», о которых идет речь, или почему (или даже когда) вызов этих методов является «существенным».
Примеры пользовательских контроллеров контейнеров в разделе «Контроллеры пользовательских контейнеров» в документации Apple полностью вызывают этот метод, поэтому я предполагаю, что он служит важной цели, за исключением того, что он просто выводит дочерний элемент ViewController на массив, но я не может понять, что это за цель. Что делает этот метод, и почему я должен его называть?
компании Apple [** 2011 ** WWDC] (https://developer.apple.com/videos/wwdc/2011/) на странице видео есть страница _great_ («Реализация UIViewController Containment») в этом разделе. – Alladinian