Просмотр iOS Viewer в представлении UIViewController?
Является ли, как правило, плохой практикой программирования в iOS иметь представление вложенного представления контроллера в представлении UIViewController? Скажем, например, я хотел иметь какой-то интерактивный элемент, который реагирует на пользовательские касания, но он занимает всего 25% экрана.
Предположим, я добавлю этот вложенный контроллер представления в свой UIViewController, сказав что-то вроде:
[self.view addSubview: nestedViewController.view];
Ответы
Ответ 1
Нет, это, как правило, хороший дизайн, он помогает держать ваши контроллеры представлений краткими. Однако вы должны использовать шаблон ограничения контроллера представления, посмотрите следующую документацию.
Внедрение контроллера просмотра контейнеров
Это невероятно просто настроить с помощью Interface Builder со Storiesboards, взгляните на представление контейнера в библиотеке объектов.
Вот надуманный пример в раскадровке. В этом примере у вас будет 4 диспетчера представлений, один из которых содержит 3 контейнера и один для каждого контейнера. Когда вы представляете самый левый контроллер, который имеет все контейнеры, Storyboard автоматически инициализирует и внедряет другие. 3. Вы можете получить доступ к этим контроллерам дочерних представлений с помощью свойства childViewControllers
или есть способ, которым вы можете переопределить prepareForSegue:sender:
и захватить контроллеры представления назначения для вызова, который будет вызываться. Это также хороший момент для передачи свойств контроллерам дочерних представлений, если они необходимы.
![enter image description here]()
Ответ 2
Я помещаю этот код в родительский контроллер представления. Это отлично работает для меня.
Obj C
-(void)viewDidLoad{
[super viewDidLoad];
InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
[self addChildViewController:innerViewController];
[self.view addSubview:innerViewController.view];
[innerViewController didMoveToParentViewController:self];
}
Swift
let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
self.addChildViewController(childViewController)
self.view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)
Другой вариант - использовать IB и отображать контейнер. UIViewController будет отображаться автоматически (XCode 9 в этом случае):
![введите описание изображения здесь]()
Ответ 3
Вот мое решение Swift 3 на основе Swift Developers On FB answer
let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
self.addChildViewController(childViewController)
self.view.addSubview(childViewController.view)
childViewController.didMove(toParentViewController: self)