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

现在我有一个视图控制器包含1个分段控制和2个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个控制器视图,所以我可以切换他们使用分段控制。

在这里输入图像说明

请指教。

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

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

显然,这假定你已经在视图中已经有了第一个子视图控制器(如果你在界面生成器中使用“容器视图”控件很容易完成)并且UISegmentedControl的缺省选定值匹配。 您还必须有这两个子场景的故事板标识符。

Swift 2翻译,请参阅此答案的以前的修订 。

我前段时间曾经广泛尝试过。 出于某种原因,隐藏的属性不适用于我,容器视图似乎不会更新。 我知道这不是理想的解决scheme,但我最终创build了两个容器视图,并使用分段控件来更改容器视图的alpha。 再次,不理想,但它很好地工作。

导入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() } 

}