iOS вложенные контроллеры представления вид внутри представления UIViewController?
это обычно плохая практика программирования в iOS, чтобы иметь представление контроллера вложенного представления внутри представления UIViewController? Скажем, например, я хотел иметь какой-то интерактивный элемент, который реагирует на прикосновения пользователя, но только занимает около 25% экрана.
Я полагаю, что я бы добавил этот вложенный контроллер представления в свой UIViewController, сказав что-то вроде:
[self.view addSubview: nestedViewController.view];
3 ответов:
нет, это вообще хороший дизайн, он помогает держать ваши регуляторы взгляда сжатым. Однако вы должны использовать шаблон сдерживания контроллера вида, взгляните на следующую документацию.
реализация контроллера вида контейнера
Это невероятно просто настроить с помощью Interface Builder с раскадровками, а также, взгляните на представление контейнера в библиотеке объектов.
вот надуманный пример в раскадровке. В этом примере у вас будет 4 контроллера вида, один из которых содержит 3 контейнера и по одному для каждого контейнера. Когда вы представляете самый левый контроллер, который имеет все контейнеры, раскадровка автоматически инициализирует и вставляет другие 3. Вы можете получить доступ к этим контроллерам дочерних представлений через
childViewControllersсвойство или есть метод, который можно переопределитьprepareForSegue:sender:и захватите контроллеры вида назначения segue, который будет вызван. Это также хороший момент для передачи свойств дочерние контроллеры представления, если таковые необходимы.
я помещаю этот код в контроллер родительского вида. Он отлично работает для меня.
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]; }Свифт:
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)


Comments