通过一个容器视图传递多个ViewController-Xcode 8,Swift 3

eth*_*x27 5 user-interface ios swift swift3 xcode8

我只是想在按下按钮时通过容器容器传递一个Viewcontroller。我的导航也在容器视图中,并且水平滚动(像码头一样)。这里有2张图片来说明我正在尝试做的事情。 在此处输入图片说明

在此处输入图片说明

ContainerView有可能吗?

eth*_*x27 5

Figured it out!! I removed the blue Container View and swapped it for a Scroll View Here's the Code for anyone else who is interested in this. Still working on making toe Container View's height dynamic to the content.

This tutorial helped a lot: Tutorial

Main View Controller:

var container: ContainerViewController!

override func viewDidLoad() {
    container!.segueIdentifierReceivedFromParent("first")

}

@IBAction func firstBtnPressed(_ sender: Any) {
    let vc = "first"
     container!.segueIdentifierReceivedFromParent(vc)

}

@IBAction func secondBtnPressed(_ sender: Any) {
    container!.segueIdentifierReceivedFromParent("second")
}

@IBAction func thirdBtnPressed(_ sender: Any) {
    container!.segueIdentifierReceivedFromParent("third")
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "container"{

        container = segue.destination as! ContainerViewController

    }
}
Run Code Online (Sandbox Code Playgroud)

Container View(Purple View)

open class ContainerViewController: UIViewController {
    //Manipulating container views
    fileprivate weak var viewController : UIViewController!
    //Keeping track of containerViews
    fileprivate var containerViewObjects = Dictionary<String,UIViewController>()

    /** Specifies which ever container view is on the front */
    open var currentViewController : UIViewController{
        get {
            return self.viewController  
        }
    }

    fileprivate var segueIdentifier : String!

    /*Identifier For First Container SubView*/
    @IBInspectable internal var firstLinkedSubView : String!

    override open func viewDidLoad() {
        super.viewDidLoad()
    }

    open override func viewDidAppear(_ animated: Bool) {
        if let identifier = firstLinkedSubView{
            segueIdentifierReceivedFromParent(identifier)
        }
    }

    override open func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func segueIdentifierReceivedFromParent(_ identifier: String) {        
        self.segueIdentifier = identifier
        self.performSegue(withIdentifier: self.segueIdentifier, sender: nil)    
    }

    override open func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == segueIdentifier {            
            //Remove Container View
            if viewController != nil {
                viewController.view.removeFromSuperview()
                viewController = nil
            }
            //Add to dictionary if isn't already there
            if ((self.containerViewObjects[self.segueIdentifier] == nil)) {
                viewController = segue.destination
                self.containerViewObjects[self.segueIdentifier] = viewController                
            } else {
                for (key, value) in self.containerViewObjects {
                    if key == self.segueIdentifier {                        
                        viewController = value
                    }
                }
            }

            self.addChildViewController(viewController)
            viewController.view.frame = CGRect(x: 0,y: 0, width: self.view.frame.width,height: self.view.frame.height)
            self.view.addSubview(viewController.view)
            viewController.didMove(toParentViewController: self)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)