Что на самом деле делает addChildViewController?

я впервые окунулся в разработку iOS, и одним из первыхмы должны были сделать, это реализоватьнастраиваемый контроллер вида контейнера - давайте назовем этоSideBarViewController - который меняет, какой из нескольких возможных дочерних контроллеров представления он показывает, почти как стандартКонтроллер панели вкладок, (Это'в значительной степениКонтроллер панели вкладок но со скрываемым боковым меню вместо панели вкладок.)

В соответствии с инструкциями в документации Apple, я звонюaddChildViewController всякий раз, когда я добавляю дочерний ViewController в свой контейнер. Мой код для замены текущего дочернего контроллера представления отображаетсяSideBarViewController выглядит так:

- (void)showViewController:(UIViewController *)newViewController {
    UIViewController* oldViewController = [self.childViewControllers 
                                           objectAtIndex:0];

    [oldViewController removeFromParentViewController];
    [oldViewController.view removeFromSuperview];

    newViewController.view.frame = CGRectMake(
        0, 0, self.view.frame.size.width, self.view.frame.size.height
    );
    [self addChildViewController: newViewController];
    [self.view addSubview: newViewController.view];
}

Тогда я начал пытаться выяснить, что именноaddChildViewController здесь, и я понял, что понятия не имею. Кроме того, торчащий новыйViewController в.childViewControllers массив, похоже, ни на что не влияет. Акции и розетки от дочернего контроллерас точки зрения дочернего контроллера, что яустановить на раскадровке все еще работает очень хорошо, даже если я никогда не звонюaddChildViewController, и я могу'не представляю, на что еще это может повлиять.

Действительно, если я переписываю свой код, чтобы не звонитьaddChildViewControllerи вместо этого выглядеть так ...

- (void)showViewController:(UIViewController *)newViewController {

    // Get the current child from a member variable of `SideBarViewController`
    UIViewController* oldViewController = currentChildViewController;

    [oldViewController.view removeFromSuperview];

    newViewController.view.frame = CGRectMake(
        0, 0, self.view.frame.size.width, self.view.frame.size.height
    );
    [self.view addSubview: newViewController.view];

    currentChildViewController = newViewController;
}

... тогда мое приложение все еще работает отлично, насколько я могу судить!

Документация Apple непролил много света на то, чтоaddChildViewController делает, или почему мыя должен это назвать. Полный объем соответствующего описания того, что метод делает или почему его следует использовать в его разделе вUIViewController Ссылка на класс есть, на данный момент:

Добавляет данный контроллер представления как дочерний элемент. ... Этот метод предназначен для вызова только реализацией пользовательского контроллера представления контейнера. Если вы переопределите этот метод, вы должны вызвать super в своей реализации.

Там'также этот параграф ранее на той же странице:

Ваш контроллер представления контейнера должен связать дочерний контроллер представления с самим собой перед добавлением дочернегос корневым представлением к иерархии представлений. Это позволяет iOS правильно направлять события на дочерние контроллеры представления и представления, которыми управляют эти контроллеры. Аналогично, после того, как это удаляет ребенкаКорневое представление от своей иерархии представления должно отключить этот дочерний контроллер представления от самого себя. Чтобы создать или разорвать эти ассоциации, ваш контейнер вызывает определенные методы, определенные базовым классом. Эти методы не предназначены для вызова клиентами вашего контейнерного класса; они должны использоваться только вашим контейнеромРеализация для обеспечения ожидаемого поведения сдерживания.

Вот основные методы, которые вам могут понадобиться вызвать:

addChildViewController:

removeFromParentViewController

willMoveToParentViewController:

didMoveToParentViewController:

но это нене могу дать никакого представления о том, чтоСобытия' или же 'ожидаемое поведение сдерживания » это'мы говорим о том, почему (или даже когда) вызов этих методовсущественным».

Примеры пользовательских контроллеров контейнерных представлений в разделе "Контроллеры пользовательских контейнеров В разделе документации Apple все вызывают этот метод, поэтому я предполагаю, что он служит какой-то важной цели, помимо простого помещения дочернего ViewController в массив, но я не могу 'не понять, что это за цель. Что делает этот метод, и почему я должен называть его?

Ответы на вопрос(3)

Ваш ответ на вопрос