9

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

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

Схема моего Main.storyboard как это:

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 функции (в которых я определить, когда опция меню нажата), чтобы изменить ребенка View Controller of Container Вид:

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) 
} 

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

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

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

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

или

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

, но ни один из них не встраивать SEGUE. Просто покажите newChild на полном экране.

Заранее благодарен!

+0

Вы добавили представление childVC в текущий вид VC? – Horst

+0

Надеюсь, вы прочтете это: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html - у него есть все, что вам нужно, с явными примерами кода. – Losiowaty

+0

@ Losiowaty Я просмотрел эту страницу раньше, но я ее закрыл, потому что она не выглядит Swift, которую я использую. Я совершенно новый, поэтому, возможно, я ошибаюсь, и я могу использовать оба одновременно. Пожалуйста, поправьте меня, если я ошибаюсь. –

ответ

3

Вы должны иметь IBOutlet для ContainerView и addSubview к этому IBOutlet

currentController.containerView.addSubview(newChild.view) 

или

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

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

0

Прямо перед вызовом currentController .addChildViewController(newChild), попробуйте следующее:

newChild.modalPresentationStyle = .CurrentContext 

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

+0

Благодарим вас за ответ, но он также отображается на весь экран. Я думаю, что это может быть что-то о встраивании segue, но я пока не могу это сделать. Посмотрите мое редактирование, чтобы посмотреть, что я пробовал. –

0

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

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

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

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

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

Сообщите мне, если это неясно, и я с радостью предоставил примеры кода, если это необходимо.

0
//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) 
0

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

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

0

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

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 
Смежные вопросы