Swift - 如何将两个视图控制器链接到一个容器视图中,并使用分段控件在它们之间切换?

Moh*_*din 13 ios swift xcode6

现在我有一个视图控制器,包含1个分段控件和2个UI视图.但我认为更新UI视图以进行增强以供将来编辑太复杂了.我正在使用隐藏方法.

import UIKit

class PopularHistoryViewController: UIViewController {


    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var popularView: UIView!
    @IBOutlet weak var historyView: UIView!

    @IBAction func indexChanged(sender: UISegmentedControl) {
        switch segmentedControl.selectedSegmentIndex
        {
        case 0:
            NSLog("Popular selected")
            //show popular view
            popularView.hidden = false
            historyView.hidden = true
        case 1:
            NSLog("History selected")
            //show history view
            popularView.hidden = true
            historyView.hidden = false
        default:
            break; 
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

}
Run Code Online (Sandbox Code Playgroud)

我想要的是1个包含2个控制器视图的容器视图,因此我可以使用分段控件来切换它们.

在此输入图像描述

请指教.

Rob*_*Rob 28

另一种方法是一次只在内存中有一个子视图控制器,然后在分段控件中更改选定的值时,加载新的子视图控制器,在一个子视图控制器之间转换到下一个子视图控制器,然后删除旧子视图控制器:

let viewControllerIdentifiers = ["first", "second"]  // storyboard identifiers for the child view controllers

@IBAction func didChangeValue(sender: UISegmentedControl) {
    let newController = storyboard!.instantiateViewController(withIdentifier: viewControllerIdentifiers[sender.selectedSegmentIndex])
    let oldController = childViewControllers.last!

    oldController.willMove(toParentViewController: nil)
    addChildViewController(newController)
    newController.view.frame = oldController.view.frame

    transition(from: oldController, to: newController, duration: 0.25, options: .transitionCrossDissolve, animations: {
        // nothing needed here
    }, completion: { _ -> Void in
        oldController.removeFromParentViewController()
        newController.didMove(toParentViewController: self)
    })
}
Run Code Online (Sandbox Code Playgroud)

显然,这假设您已经在视图上已经有了第一个子视图控制器(如果您在Interface Builder中使用"容器视图"控件,则很容易完成)和UISegmentedControl匹配项的默认选定值.您还必须具有这两个子场景的故事板标识符.

对于Swift 2的演绎,请参阅此答案的上一版本.


sco*_*ott 1

不久前我广泛尝试这样做。由于某种原因,隐藏属性对我不起作用,并且容器视图似乎没有更新。我知道这不是理想的解决方案,但我最终创建了两个容器视图并使用分段控件来更改容器视图的 alpha。同样,虽然不理想,但效果很好。