Является ли обычно плохой практикой программирования в iOS иметь представление контроллера вложенного представления внутри представления UIViewController? Скажем, например, я хотел иметь какой-то интерактивный элемент, который реагировал бы на прикосновения пользователя, но занимал бы только 25% экрана.
Полагаю, я бы добавил этот контроллер вложенного представления в свой UIViewController, сказав что-то вроде:
[self.view addSubview: nestedViewController.view];
ios
uiviewcontroller
viewcontroller
Скайлер
источник
источник
Ответы:
Нет, это в целом хороший дизайн, он помогает сохранить лаконичность ваших контроллеров представления. Однако вы должны использовать шаблон включения контроллера представления, ознакомьтесь со следующей документацией.
Реализация Контроллера представления контейнера
Это невероятно просто настроить с помощью Interface Builder с раскадровками, взгляните на представление контейнера в библиотеке объектов.
Вот надуманный пример в раскадровке. В этом примере у вас будет 4 контроллера представления, один из которых содержит 3 контейнера, и по одному для каждого контейнера. Когда вы представляете крайний левый контроллер, содержащий все контейнеры, Storyboard автоматически инициализирует и внедряет остальные 3. Вы можете получить доступ к этим дочерним контроллерам представления через
childViewControllers
свойство или есть метод, который вы можете переопределитьprepareForSegue:sender:
и захватить контроллеры представления назначения переход, который будет называться. Это также хороший момент для передачи свойств дочерним контроллерам представления, если они необходимы.источник
Я поместил этот код в родительский контроллер представления. У меня это отлично работает.
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):
источник
Вот мое решение Swift 3, основанное на ответе разработчиков Swift на FB
let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"), self.addChildViewController(childViewController) self.view.addSubview(childViewController.view) childViewController.didMove(toParentViewController: self)
источник