现在我有一个视图控制器,包含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个控制器视图的容器视图,因此我可以使用分段控件切换它们。
请建议。
答案 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()
}
}