0

Допустим, что на отводом UIButton в ViewControllerA происходит следующее, прежде чем перейти к ViewControllerB:Как разделить UIView между переходом UIViewController (с кодом addChildUsingController :)

- (IBAction)levelSelectButton:(id)sender { 
    ViewControllerB* obj = [[ViewControllerB alloc] init]; 
    [self addChildViewController:obj]; 
    CGSize screenSize = [MainScreen screen]; 
    CGFloat screenWidth = screenSize.width; 
    CGFloat screenHeight = screenSize.height; 
    obj.view.frame = CGRectMake(0,0,screenWidth,screenHeight); 
    [obj.view addSubview:_banner]; 

    //[obj didMoveToParentViewController:self]; 
    [self runPushAnimationWithController:obj]; 
} 

Когда ViewControllerB показывает вверх, я могу видеть мой _banner (a GADBannerView объект) вид на месте, но когда я возвращаюсь к ViewControllerA его больше нет.

Я никогда не использовал addChildViewController:/didMoveToParentViewController: методы, прежде чем, так что я не знаю, если это, как ожидается, но я хочу, чтобы иметь возможность вернуться к ViewControllerA с _banner еще видны.

Должен ли я сохранить его?

+0

Что именно вы хотите сделать при нажатии кнопки? Как открыть другой контроллер вида внутри вашего собственного контроллера? или вы просто хотите нажать контроллер вида с помощью некоторой настраиваемой переходной анимации? –

ответ

0

Вид может принадлежать только одному супервину. Чтобы процитировать документы Apple:

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

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

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

Если вы полностью настроились на перемещение своего вида вокруг диспетчеров вида, я бы добавил свойство к новому контроллеру представления и установил это свойство, а не манипулировал иерархией представления другого представления. Вам также необходимо передать представление НАЗАД, когда вы вернетесь к текущему контроллеру.

Вы должны рассматривать иерархию представлений контроллера вида как конфиденциальную. Не делать этого нарушает принцип инкапсуляции.

+0

Спасибо Duncan, что очень помогает, и вы убедили меня отказаться от всех отношений между родителями и дочерними элементами между двумя контроллерами (и, в свою очередь, всеми остальными контроллерами, которые у меня есть). –

+0

Отношения родитель-ребенок могут быть очень полезными, но я не думаю, что вы используете его правильно. Взгляните на представления контейнеров и вставьте segues. –

+0

Вот что я думал, что делаю, или, по крайней мере, правильно применяю. Я не имею дело с Storyboards или Xib-файлами, поэтому я делаю все программно. В общем, я хотел иметь встроенный segue между двумя контроллерами, где '_banner' был видом контейнера (статья [link] https://spin.atomicobject.com/2015/07/21/ios-container-views/суммирует его) –