UIViewController в UIView

Можно ли загрузить UiViewController в UIView в другом UIViewcontrller.

предположим, что UIViewControllerA имеет UIView с именем subuiview. Могу ли я загрузить UIViewControllerB в subbuiview?

Спасибо!

Ответ 1

Начиная с iOS 5

"Контроллеры контейнеров" добавлены в iOS 5. Вы можете добавить контроллер представления как дочерний элемент другого с помощью addChildViewController:.
Вы также несете ответственность за добавление своего представления в родительское представление.

Все документально подтверждено документацией iOS SDK: Внедрение настраиваемого контроллера просмотра контейнеров.

Чтобы добавить контроллер детского представления:

childViewController.frame = ...
[self.view addSubview:childViewController.view];
[self addChildViewController:childViewController];
[childViewController didMoveToParentViewController:self];

и удалить его:

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

До iOS 5

Можно загрузить другой контроллер представления и добавить его представление в виде подсмотра другого вида контроллера.

UIViewController *subController = ...
[self.view addSubview:subController.view];

Хотя это не рекомендуется рекомендациями Apple:

Каждый пользовательский объект контроллера просмотра create отвечает за управление всеми взглядов в одном представлении иерархия. [...] Индивидуально соответствие между представлением контроллер и представления в его представлении иерархия - ключевой дизайн рассмотрение. Вы не должны использовать несколько настраиваемых контроллеров управлять разными частями того же иерархию представлений.

(из Руководство по программированию контроллера просмотра)

Ваш субконтроллер не будет принимать события вращения или viewWillAppear, viewWillDisappear и т.д. (кроме viewDidLoad).

Итак, Apple советует нам использовать единый контроллер представления, управляющий всей иерархией представлений (но не запрещает использовать несколько).

Каждое представление может по-прежнему являться пользовательским подклассом UIView. Возможно, вам не нужен другой контроллер представления, а пользовательский вид.

Ответ 2

Всегда было проблематично просто использовать addSubview, чтобы добавить представление диспетчера представлений в качестве подсмотра другого. Это особенно плохо, когда люди используют его для перехода между взглядами, вместо того, чтобы полагаться на другие, более надежные решения, такие как presentViewController или pushViewController.

Если вы действительно хотите добавить один вид диспетчера представлений в качестве подзадачи другого, iOS5 представил "сдерживание контроллера вида". Сдерживание обсуждается в "Руководство по программированию на просмотр" , а также сессия WWDC 2011. В нижней строке вы хотите, чтобы ваша иерархия контроллера просмотра синхронизировалась с вашей иерархией представлений, путем вызовов на addChildViewController, didMoveToParentViewController и т.д. Подробнее см. Документацию и видео.

Ответ 3

[self addSubview:viewControllerB.view];

попробуйте это в подпункте

Ответ 4

Ну, вы не можете технически загрузить диспетчер view. Вы можете загрузить представление viewcontroller в качестве подсмотра любого вида.

Вам нужно также сохранить контроллер просмотра, если у вас есть какие-либо действия, связанные с ним. В противном случае это может привести к сбоям.

addsubview:controller.view - это метод, который вы хотите посмотреть.