2015-05-27 2 views
2

У меня есть UIViewController с UIContainerView внутри. Исходя из того, истинно ли какое-либо условие, я хотел бы программным образом установить встроенный просмотр контейнера в другой UIViewController. Я заметил, что у вас может быть только один встроенный segue для установки одного UIViewController, так есть ли способ сделать это?iOS - Программный набор Встраиваемый UIViewController UIContainerView

Я попытался настроить мой контейнерный вид как розетку, но я не мог найти никаких методов, которые устанавливали встроенный UIViewController. Любые советы о том, как начать работу с этим, будут оценены.

+0

Что вы действительно хотите достичь? –

+0

Не смешивайте раскадровки и программные настройки. Делайте по одному. Нет ничего плохого в смешивании обоих, но вы рискуете запутаться, пока не поймете, как работает раскадровка. –

+0

Возможно, вы захотите переписать '- prepareForSegue: sender:', чтобы управлять разными сегментами на основе 3-х условий. Или не перейдите, но перейдите к новому контроллеру представления программным способом или вызовите определенный сегмент из панели рассказов с помощью '- performSegueWithIdentifier: sender:' –

ответ

6

Я думаю, что ваша идея ошибочна, если вы имели в виду замену UIViews из UIViewController (надеюсь, я понял вашу концепцию).

A UIViewController должен иметь 1 сконструированный UIView и должен управлять значениями этого вида. Как вы сказали, вы можете использовать Containers, однако вы должны добавить UIViewController с его представлением, поэтому есть экземпляр, который управляет этим представлением. Твой первый UIViewController должен только добавить/удалить ChildViewController.

Так что я бы посоветовал:

Реализовать категории на UIViewController и добавьте следующие методы:

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

- (void)hideContentController:(UIViewController *)content { 
    [content willMoveToParentViewController:nil]; 
    [content.view removeFromSuperview]; 
    [content removeFromParentViewController]; 
} 

Создать AViewController и BViewController. В AViewController вызова (viewDidLoad?):

BViewController *bViewController = [[BViewController alloc] init]; 
[self displayContentController:bViewController]; 

BViewController В управлении вид этого контроллера. AViewController должен управлять только, когда показывать BViewController и когда его скрывать.

Если я не понял ваш вопрос, прокомментируйте его, я удалю этот ответ.

+0

Это на самом деле довольно умный способ сделать это. Другие упомянутые должности создают настраиваемый контроллер представления контейнеров, но для этого требуется наименьшее количество сложности и времени мышления. Благодаря! :) – Rafi

+0

Согласно документации, оба метода 'willMove' и' didMove' должны быть вызваны обоими вашими методами. – Rivera

+0

@Rivera Из документации Apple: _ «Метод removeFromParentViewController() автоматически вызывает метод didMove (toParentViewController :) контроллера дочернего представления после удаления дочернего элемента.» _ И _ «Когда ваш пользовательский контейнер вызывает addChildViewController (_ :) метод, он автоматически вызывает метод willMove (toParentViewController :) контроллера вида, который будет добавлен в качестве дочернего элемента, прежде чем добавлять его. "_. Надеюсь, это ответит на ваши сомнения. – Vive

0

Вдохновленный ответ Vive в:

extension UIViewController { 

    func showContentController(_ controller: UIViewController, containerView: UIView? = nil) { 
     controller.willMove(toParentViewController: self) 
     self.addChildViewController(controller) 
     controller.view.frame = (containerView ?? self.view).frame 
     (containerView ?? self.view).addSubview(controller.view) 
     controller.view.autoPinEdgesToSuperviewEdges() 
     controller.didMove(toParentViewController: self) 
    } 

    func hideContentController(_ controller: UIViewController) { 
     controller.willMove(toParentViewController: nil) 
     controller.removeFromParentViewController() 
     controller.view.removeFromSuperview() 
     controller.didMove(toParentViewController: nil) 
    } 
} 
+0

Это (дублированные вызовы 'will' /' didMove') не только не требуется, но вызывает вызов 'willMove' и' didMove' для вызова дважды - то, что недействительно. См. Мой комментарий выше с цитатой из документации Apple. – Vive

Смежные вопросы