Просмотр 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)