Как я могу переключаться между двумя дочерними контроллерами просмотра на Swift?

я пытаюсь переключиться между двумя детьми View Controllers в частности Container View. У меня есть Navigation Controller меню (Table View сделать различные варианты меню).

каждый раз, когда я нажимаю опцию меню, я хотел бы изменить ребенка Container View но я получаю ребенка выше Navigation bar и Table View (они не отображаются, но они находятся под новым контроллером дочернего представления).

схема моя основная.раскадровка как это:

Navigation Controller --> View Controller (With 2 Container View, 1 for Table View
                                           and the other to set master View Controller)
                                         |
                                         |
                               ------------------------
                               |                      |
                          View Controller        Table View
                            (id: master)

                   View Controller (id: Home)   View Controller (id: screen2)

у меня есть следующий код в tableView функция (в которой я обнаруживаю, когда нажата опция меню), чтобы изменить контроллер дочернего представления представления контейнера:

let currentController = self.navigationController?.visibleViewController //container

var oldChild = (currentController?.childViewControllers.last!)! as UIViewController //master
let newChild = (storyboard?.instantiateViewControllerWithIdentifier("Home"))! as UIViewController //Home

if (oldChild != newChild){
    if currentController.childViewControllers.last != nil{
        oldChild.willMoveToParentViewController(nil)
        currentController.navigationController?.navigationBar.willRemoveSubview(oldChild.view)
        //oldChild.view.removeFromSuperview()
        oldChild.removeFromParentViewController()
    }

    currentController.addChildViewController(newChild)
    currentController.view.addSubview(newChild.view)
    newChild.didMoveToParentViewController(currentController) 
}

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

должен ли я добавить что-то больше к моему коду или я использую свой код неправильно? Я много искал об этом, но большинство решений находятся в objective-c или не работают для меня.

EDIT: после поиска в течение многих часов я подозреваю, что это что-то связанное с встроенным сегментом, который соединяет корень View Controller С master View Controller, но я не могу встроить нового ребенка в Container View. Код, который я пытаюсь:

currentController.performSegueWithIdentifier("EmbedSegue", sender: newChild)

или

currentController.presentViewController(newChild, animated: true, completion: nil)

но ни один из них не вставляет сегмент. Просто покажите newChild на полный экран.

спасибо заранее!

6 ответов


У вас должен быть IBOutlet для ContainerView и addSubview для этого IBOutlet

currentController.containerView.addSubview(newChild.view)

или

currentController.addSubview(childView.view, toView: self.containerView)

прямо перед вызовом currentController.addChildViewController(newChild), попробуйте это:

newChild.modalPresentationStyle = .CurrentContext

Это должно отображаться newChild просмотр контроллера в пределах вашего вида контейнера вместо полного экрана.


вы не хотите использовать presentViewController, и я не думаю, что использование segue также правильно, это вызовет полноэкранное покрытие.

Я думаю, что вы изначально на правильном пути, вам нужны представления или viewcontrollers?

для UIViews вы можете просто заполнить свое представление нужными значениями, А затем заменить представление контейнера новым представлением, вы также можете загрузить UIView для сцены xib или раскадровки.

Для UIViewControllers, I предположим, если у вас есть определенная логика в методах жизненного цикла, вам нужно добавить их в качестве дочерних viewcontrollers и снова заменить представление контейнера viewController.вид.

наконец, вы просто запускаете логику в своем didselectrowatindexpath метод. Просто попробуйте базовый пример, создайте UIView с оранжевым backgroundcolor и do self.containerView = orangeView.

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


//set off the viewcontroller UNDERTOPBAR property off. your VC will load in currentControllers view. you need to set the frame of the view that your are going to load.

currentController.addChildViewController(newChild)
newChild.view.frame = CGRectMake(self.currentController.bounds.origin.x, self.currentController.bounds.origin.y, self.currentController.bounds.size.width, self.currentController.bounds.size.height)
currentController.view.addSubview(newChild.view)
newChild.didMoveToParentViewController(currentController)

сделайте выход контейнера и добавьте свой дочерний контроллер так:self.addSubview(self.currentViewController!.view, toView: self.containerView)

Это может помочь вам.


на вопрос получен ответ, но, как я вижу в вашем коде, я рекомендую вам прикрепить край childview к parentview. Как показано ниже:

    child.view.translatesAutoresizingMaskIntoConstraints = false
    child.view.topAnchor.constraint(equalTo: parent.view.topAnchor).isActive = true
    child.view.bottomAnchor.constraint(equalTo: parent.view.bottomAnchor).isActive = true
    child.view.leadingAnchor.constraint(equalTo: parent.view.leadingAnchor).isActive = true
    child.view.trailingAnchor.constraint(equalTo: parent.view.trailingAnchor).isActive = true