2015-05-25 2 views
6

Оба метода добавляют вид как дочерний элемент parentview и просмотр могут принимать события. Когда использовать какой?Разница между addChildViewController и addSubview?

+0

привет, пожалуйста, обратитесь к этой ссылке. http://stackoverflow.com/questions/11186758/what-is-the-difference-between-addchildviewcontroller-and-presentmodelviewcontro –

+1

Вот некоторые хорошие ответы -> http://stackoverflow.com/questions/17192005/what-do-addchildviewcontroller-actual-do – Evgeniy

+1

addchildviewcontroller работает для ViewControllers (добавляет его как подконтроллер mainViewcontroller, особенно в containerViewControllers), а другой работает над addSubview в представлениях (добавляет subviews в parentView). Основное отличие их действия от ViewController и UIView соответственно. Прочитайте это http://stackoverflow.com/questions/17192005/what-does-addchildviewcontroller-actually-do –

ответ

6

Они очень разные. addChildViewController связывает контроллер представления с родительским контроллером представления контейнера, в то время как addSubview добавляет представление к иерархии представлений, к которой она добавляется. В первом случае новый контроллер дочернего представления будет отвечать за обработку событий, когда он является выбранным контроллером представления его родителя. Подумайте о контроллере панели вкладок - каждая вкладка имеет свой собственный связанный «дочерний» контроллер представления, который отображает его представление в области содержимого родительского элемента панели вкладок и обрабатывает любое взаимодействие с пользователем в этом представлении, когда его соответствующая вкладка выбрана на панели вкладок. Вы должны использовать только addChildViewController, когда у вас есть пользовательский вид контейнера, и хотите добавить новый контроллер представления в его свойство childViewControllers. Если вы просто хотите добавить новое представление в иерархию представлений, которые могут получать события, что, по-вашему, похоже, addSubview - это путь. "Implementing a Container View Controller" section explains what addChildViewController is for.

+0

great.explanation.mate :) –

1

Доступна с прошивкой 5, метод addChildViewController:

- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0); 

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

Ребенок контроллер не что иное, как экземпляр UIViewController и таким образом она будет обеспечивать функциональность контроллера вида (т.е. он будет получать события, как -(void)viewWillAppear, - (void)viewWillDisappear, и т.д., как обычный UIViewController делает).

С другой стороны

- (void)addSubview:(UIView *)view; 

addSubview: добавит любой вид в subview на какой-либо другой точки зрения.

Это не выбор, который следует использовать, если речь идет о типе, который просит использовать конкретный метод.

Для Instance -

Если у вас есть экземпляр UIViewController, чем вы определенно будете использовать addChildViewController: (также вы можете использовать presentModalViewController, pushViewController), и если у вас есть экземпляр UIView, чем, безусловно, вы должны использовать addSubview ,

Примечание: Вы также можете добавить вид контроллера контроллера в качестве подзапроса для любого другого вида.

2

addChildViewController является метод, в UIViewController класса и addSubview находится в UIView класса

Оба имеют совершенно различное поведение.

addChildViewController просто устанавливает контроллер представления перед текущим. Вы должны управлять потоком контроллеров. Этот метод предназначен только для вызова реализацией пользовательского контроллера представления контейнера.

addSubview добавляет другое представление в виде суб-представления к виду этого объекта.

13

Все зависит от того, как вы хотите управлять новым подвью. Если вы хотите, чтобы управление новым подзоном управлялось контроллером представления текущего вида (например, вы добавляете что-то простое, например, несколько объектов UILabel), вы просто вызываете addSubview. Если, с другой стороны, новый subview имеет свой собственный контроллер представлений (т. Е. Это достаточно сложный набор представлений с богатыми функциональными возможностями, которые вы хотите инкапсулировать всю эту сложность своим собственным контроллером для управления всем этим новым подзаданием), тогда вы вызываете addChildViewController, чтобы добавить новый контроллер просмотра, но затем позвоните по телефону addSubview.

Итак, обратите внимание, что addChildViewController, сам по себе, ничего не делает с представлениями. Обычно вы просто следуете за ней с помощью вызовов, которые также добавляют его представление, например. здесь немного выяснен пример из Implementing a Custom Container View Controller раздела Руководства по программированию View Controller для прошивки:

[self addChildViewController:childViewController];  // add subview's view controller 
childViewController.view.frame = ...      // specify where you want the new subview 
[self.view addSubview:childViewController.view];   // now you can add the child view controller's view 
[childViewController didMoveToParentViewController:self]; // now tell the child view controller that the adding of it and its views is all done 

Таким образом, это не вопрос addSubview против addChildViewController, а addSubview против addChildViewController + addSubview. Если вы звоните addChildViewController, вы делаете это с намерением позвонить addSubview для своего вида в какой-то момент.

Честно говоря, этот вопрос addSubview против addChildViewController + addSubview редко, как мы об этом думаем. Более логичный способ думать об этом - определить, имеет ли этот новый вид свой собственный контроллер представления. Если это так, вы выполняете последовательность вызовов addChildViewController. Если нет, вы просто вызываете addSubview.

Для ознакомления с представлением контроллера (например, обоснование для этого API, важность сохранения иерархии представлений, синхронизированной с иерархией диспетчера представлений и т. Д.), См. Видео WWDC 2011 Implementing UIViewController Containment.

+0

В блоке кода. Я понимаю все строки, кроме последней строки. Это кажется излишним. Вы уже сказали 'parentViewController', что у него есть childView. Почему вы должны сказать childView, что у вас есть родитель ?! При добавлении subview мы просто делаем 'self.addSubView (subview)'. Мы не добавляем дополнительный 'subview.didGerAddedToSuperView' – Honey

+1

Это не избыточно. Это важная часть сдерживания. Я предлагаю вам это видео, которое описывает, зачем вам это нужно. В нижней строке 'willMoveToParentViewController' (который вызывается' addChildViewController') и 'didMoveToParentViewController' записывает этот процесс (например,' viewWillAppear' и 'viewDidAppear'). – Rob

+0

О, хорошо, хорошая аналогия. * хочу, чтобы это видео * <- что вы имеете в виду? Что за видео? – Honey

0

На основании некоторого теста я обнаружил, что: если контроллер дочернего представления не добавлен в контроллер родительского представления (при условии, что контроллер родительского представления находится под контроллером корневого представления), в представление родительского представления добавляется только представление контроллера детского представления , то:

  • суб-контроллер может по-прежнему получать сообщения, непосредственно связанные с просмотра, такие как - viewWillAppear:, - viewWillLayoutSubviews и т.д.

Но

  • вид югу не может получить некоторые системные сообщения, такие как - willRotateToInterfaceOrientation:duration:

Я не могу дать список сообщений в настоящее время, однако.

0

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

+0

Пожалуйста, добавьте код – Kapil

+0

Ваш пост больше похож на предложение – Raju

2

Зная, что MVC означает Model-View-Controller:

Если вы только собираетесь добавить вид, а затем использовать addSubview. например добавив ярлык, кнопку.

Однако, если вы собираетесь в d зрения + контроллер, то вы должны использовать addChildViewController, чтобы добавить свой контроллер, а также addSubView добавить свой вид. например добавив еще один viewController, tableViewController.

Дополнительно:

Есть две категории событий, которые пересылаются к контроллерам зрения ребенка:

1- Внешний вид Методы:

- viewWillAppear: 
- viewDidAppear: 
- viewWillDisappear: 
- viewDidDisappear: 

2- Методы вращения:

- willRotateToInterfaceOrientation:duration: 
- willAnimateRotationToInterfaceOrientation:duration: 
- didRotateFromInterfaceOrientation: 

Для получения дополнительной информации I commend, чтобы увидеть ответы на вопрос this.

Смежные вопросы