9

Próbuję przełączać między dwoma dziećmi View Controllers na konkretnej Container View. Mam Navigation Controller z menu (Table View, aby uzyskać różne opcje menu).Jak mogę przełączać się między dwoma kontrolkami widoku dziecka na Swift?

każdym razem kliknij opcję menu chciałbym zmienić dziecku z Container View ale jestem coraz dziecko powyżej Navigation bar i Table View (nie są pokazane, ale są one w ramach nowego dziecka View Controller).

Schemat mojego Main.storyboard jest tak:

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) 

Mam następujący kod na tableView funkcji (w którym wykryć gdy opcja menu kliknięciu), aby zmienić dziecku View Controller Widok kontenera:

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

Ten kod działa prawie dobrze. Problem polega na tym, że nowy kontroler widoku dziecka jest wyświetlany nad paskiem nawigacji i widokiem tabeli (menu). Zajmuje cały ekran zamiast pasować do widoku kontenera.

Czy powinienem dodać coś więcej do mojego kodu lub czy używam mojego kodu w niewłaściwy sposób? Dużo o tym przeszukałem, ale większość rozwiązań jest obiektywna lub nie działa dla mnie.

EDIT: Po poszukiwaniach na wiele godzin Podejrzewam, że jest to coś związane z wbudowaną segue, który łączy korzeń View Controller z master View Controller, ale nie jestem w stanie osadzić nowe dziecko do Container View. Kod, który próbuję to:

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

lub

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

ale żaden z nich osadzić segue. Po prostu wyświetl numer newChild na pełnym ekranie.

Z góry dziękuję!

+0

Czy dodałeś widok childVC do bieżącego widoku VC? – Horst

+0

Mam nadzieję, że przeczytacie to: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html - ma wszystko, czego potrzeba, korzystając z jasnych przykładów kodu. – Losiowaty

+0

@Losiowaty Spojrzałem na tę stronę wcześniej, ale zamknąłem ją, ponieważ nie wygląda na Swift, którego używam. Jestem całkowicie nowy, więc może się mylę i mogę używać obu jednocześnie. Proszę, popraw mnie jeśli się mylę. –

Odpowiedz

3

Należy mieć IBOutlet dla ContainerView i addSubview do tego IBOutlet

currentController.containerView.addSubview(newChild.view) 

lub

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

Dziękuję bardzo! Twoje pierwsze zdanie było wskazówką! Czuję, że utknąłem w ścianie, ponieważ myślałem, że to coś związanego z segue i to było coś w pojemniku. –

0

Tuż przed wywołaniem currentController .addChildViewController(newChild), spróbuj tego:

newChild.modalPresentationStyle = .CurrentContext 

ta powinna wyświetlić kontroler newChild widok w granicach widoku pojemnika zamiast pełnego ekranu.

+0

Dziękuję za odpowiedź, ale jest ona również wyświetlana na pełnym ekranie. Sądzę, że może to być coś z osadzonego segue, ale nie jestem jeszcze w stanie go zdobyć. Spójrz na moją edycję, aby zobaczyć, co próbowałem. –

0

Nie chcesz używać presentViewController i nie sądzę, że używanie segue ma rację, spowoduje to pełną osłonę ekranu.

Myślę, że jesteś na dobrej drodze, potrzebujesz widoków lub kontrolerów view?

Dla UIViews można łatwo wypełnić widok z żądanymi wartościami, a następnie zastąpić widok kontenera nowym widokiem, można także wczytać UIView dla sceny XIB lub storyboardu.

Dla UIViewControllers, domyślam się, że jeśli masz specyficzną logikę, widzą metody cyklu życia, musisz dodać je jako child viewcontrollers i ponownie zastąpić widok kontenera viewController.view.

W końcu wystarczy uruchomić logikę w swojej metodzie didselectrowatindexpath. Po prostu spróbuj podstawowego przykładu, utwórz UIView z pomarańczowym kolorem tła i wykonaj self.containerView = orangeView.

Daj mi znać, jeśli nie jest to jasne i z przyjemnością przedstawię przykłady kodu, jeśli to konieczne.

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

wylot Producent pojemnika i dodać kontroler dziecko tak: self.addSubview(self.currentViewController!.view, toView: self.containerView)

To może ci pomóc.

0

Odpowiedzi na to pytanie, ale jak widzę w Twoim kodzie, polecam przypiąć krawędź potomka do widoku rodzica. Jak poniżej:

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