Контроллер представления контейнера программно

Я изучал это некоторое время, но не могу найти то, что мне нужно. Я хотел бы узнать, как программно создать представление контейнера с дочерним контроллером представления. Я все еще довольно новичок в этом и изучаю основы, но, насколько я понимаю, это делалось с использованием повторно используемых представлений и их присоединение к контроллерам дочерних представлений до того, как объект представления контейнера добавлялся в библиотеку (верно?), Я ищу либо учебник, либо пример кода, который показывает, как это сделать с нуля, используя xib, но без каких-либо осложнений, таких как добавление ячеек таблицы и т. д. Только контейнер и дочерний элемент программно. Имеет ли это смысл? Я уверен, что должно быть что-то на S.O. Спасибо, если вы можете помочь.

ОБНОВИТЬ ------------------------------------------------- -------------------------------------------------- ------------------- Мне удалось создать дочерний контроллер представления, который появляется с действием UIButton. Соответствующий код:

- (IBAction)Pressed:(id)sender {
    ChildViewController *childViewController = [[ChildViewController alloc]init];
    [self displayContentController:childViewController];
}

- (void) displayContentController: (UIViewController*) content {
    [self addChildViewController:content];
    content.view.frame = CGRectMake(0, 115, 320, 240);
    content.view.backgroundColor = [UIColor redColor];

        CATransition *transition = [CATransition animation];
transition.duration = 1;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[content.view.layer addAnimation:transition forKey:nil];
[self.view addSubview:content.view];
[content didMoveToParentViewController:self];
}

Так что работает нормально. Я нажимаю кнопку, и появляется красный квадрат, дочерний контроллер представления, занимающий небольшую часть экрана. Я хотел бы знать, является ли это лучшей практикой.




Ответы (1)


По сути, это предполагает наличие 1 Parent контроллера представления, который будет организовывать внешний вид своих дочерних контроллеров представления.

Честно говоря, я считаю, что Apple Docs достаточно полна по этому вопросу. часть.

Цитата из тех же документов:

Добавление контроллера дочернего представления к вашему контенту

Чтобы программно включить дочерний контроллер представления в ваш контент, создайте отношение родитель-потомок между соответствующими контроллерами представления, выполнив следующие действия:

  1. Вызовите метод addChildViewController: вашего контроллера представления контейнера. Этот метод сообщает UIKit, что ваш контроллер представления контейнера теперь управляет представлением дочернего контроллера представления.
  2. Добавьте корневое представление дочернего элемента в иерархию представлений вашего контейнера. Всегда не забывайте устанавливать размер и положение детской рамки как часть этого процесса.
  3. Добавьте любые ограничения для управления размером и положением корневого представления дочернего элемента.
  4. Вызовите метод didMoveToParentViewController: дочернего контроллера представления.

Образец кода:

- (void) displayContentController: (UIViewController*) content {
   [self addChildViewController:content];
   content.view.frame = [self frameForContentController];
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];
}

Ответ на сообщение о передовом опыте:

На Objc.io есть несколько довольно полезных статей на этот счет.

Например, статья о контейнере View Controller примечания :

Контроллеры представления должны быть многоразовыми и автономными объектами.

Контроллеры дочерних представлений не являются исключением из этого практического правила. Чтобы достичь этого, родительский контроллер представления должен заниматься только двумя задачами: размещением корневого представления дочернего контроллера представления и взаимодействием с дочерним контроллером представления через его открытый API. Он никогда не должен напрямую изменять дерево представления дочернего элемента или другое внутреннее состояние.

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

Они также говорят о переходах между контроллерами представления. при использовании этого шаблона.

person Daneo    schedule 28.01.2016
comment
Да, спасибо, я нашел это и сумел заставить его работать. Я изо всех сил пытаюсь сделать переход, хотя. Я должен был четко указать это в вопросе. Метод настоящего контроллера представления не работает для контроллеров, которые не используют полное представление, поэтому я прав, думая, что CATransition - это правильный способ сделать это? Я обновлю вопрос. - person Paul; 28.01.2016
comment
@Paul Смотрите ссылки / цитаты. Я предпочитаю цитировать некоторые правильно построенные статьи, а не давать такое же объяснение :) - person Daneo; 29.01.2016