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

时间:2015-01-17 19:50:27

标签: 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.
    }

}

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

enter image description here

请建议。

3 个答案:

答案 0 :(得分: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)
    })
}

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

对于Swift 2的演绎,请参阅previous revision of this answer

答案 1 :(得分:1)

我前一段时间尝试过这么做。出于某种原因,隐藏的属性对我来说不起作用,并且容器视图似乎不会更新。我知道它不是理想的解决方案,但我最终创建了两个容器视图,并使用分段控件来更改容器视图的alpha。再次,不理想,但它运作良好。

答案 2 :(得分:-1)

导入UIKit

类ContactsView:UIViewController {

@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var privateView: UIView!
@IBOutlet weak var publicView: UIView!

@IBAction func segmentChanged(sender: UISegmentedControl) {
    switch segmentedControl.selectedSegmentIndex
    {
    case 0:
        privateView.hidden = false
        publicView.hidden = true
    case 1:
       privateView..hidden = true
        publicView.hidden = false
    default:
        break; 
    }
}

override func viewDidLoad() {
    super.viewDidLoad()


}

}