Как я могу переключаться между двумя дочерними контроллерами просмотра на 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