我正在尝试使用UISegmentedControl在三个视图之间切换。我在主viewcontroller的容器视图中有第一个视图。然后,我在单独的视图控制器上创建了另外两个视图。我在主ViewController的容器中为这两个视图编写了子视图。
我遇到的问题是,当我切换分段控件时,后两个视图将不会显示。该段更改了容器并隐藏了第一个视图,但第二个视图没有出现。
当我通过.xib文件创建了后两个视图时,便能够使用此方法。现在的问题是,我将它们用作情节提要上的视图控制器。
代码如下:
@IBOutlet var segment: UISegmentedControl!
@IBOutlet var detailsView: UIView!
@IBOutlet var segmentView: UIView!
var viewTwo: UIView!
var viewThree: UIView!
@IBAction func segmentChange(_ sender: Any) {
switch(segment.selectedSegmentIndex) {
case 0:
detailsView.isHidden = false
segmentView.isHidden = true
break
case 1:
detailsView.isHidden = true
segmentView.isHidden = false
segmentView.bringSubviewToFront(viewTwo)
break
case 2:
detailsView.isHidden = true
segmentView.isHidden = false
segmentView.bringSubviewToFront(viewThree)
break
default:
detailsView.isHidden = false
segmentView.isHidden = true
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
viewTwo = ShowtimesView().view
segmentView.addSubview(viewTwo)
viewThree = ReviewsView().view
segmentView.addSubview(viewThree)
}
答案 0 :(得分:2)
问题是您说的是ShowtimesView().view
之类的话。这不是从情节提要中加载视图控制器的方法!您需要与情节提要进行对话并实例化视图控制器。
但是,即使如此,您所做的还是完全错误的。您不能使用视图控制器对其视图和那些肆意进入界面的东西进行“转储”。您必须使自己成为自定义父视图控制器,并使另一个视图控制器成为您的孩子。您必须做一场正式的舞蹈,而您没有参加舞蹈。
答案 1 :(得分:0)
您应该尝试下面的代码。
@IBOutlet var segment: UISegmentedControl!
@IBOutlet var segmentView: UIView!
var viewOne: UIView!
var viewTwo: UIView!
var viewThree: UIView!
@IBAction func segmentChange(_ sender: Any) {
switch(segment.selectedSegmentIndex) {
case 0:
segmentView.bringSubviewToFront(viewOne)
break
case 1:
segmentView.bringSubviewToFront(viewTwo)
break
case 2:
segmentView.bringSubviewToFront(viewThree)
break
default:
segmentView.bringSubviewToFront(viewOne)
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
viewOne = DetailView().view
segmentView.addSubview(viewOne)
viewTwo = ShowtimesView().view
segmentView.addSubview(viewTwo)
viewThree = ReviewsView().view
segmentView.addSubview(viewThree)
segmentView.bringSubviewToFront(viewOne)
}
答案 2 :(得分:0)
我通过在原始viewcontroller中为每个子视图viewcontroller创建一个容器来解决此问题。我还确保不仅为其类添加适当的名称,而且为其添加故事板ID。
这是工作代码:
@IBOutlet var segment: UISegmentedControl!
@IBOutlet var detailsView: UIView!
@IBOutlet var showtimeView: UIView!
@IBOutlet var reviewView: UIView!
var viewTwo: UIView!
var viewThree: UIView!
@IBAction func segmentChange(_ sender: Any) {
switch(segment.selectedSegmentIndex) {
case 0:
detailsView.isHidden = false
showtimeView.isHidden = true
reviewView.isHidden = true
break
case 1:
detailsView.isHidden = true
showtimeView.isHidden = false
reviewView.isHidden = true
break
case 2:
detailsView.isHidden = true
showtimeView.isHidden = true
reviewView.isHidden = false
break
default:
detailsView.isHidden = false
showtimeView.isHidden = true
reviewView.isHidden = true
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
viewTwo = ShowtimesView().view
showtimeView.addSubview(viewTwo)
viewThree = ReviewsView().view
reviewView.addSubview(viewThree)
}
答案 3 :(得分:0)
您需要从情节提要中为init视图控制器进行编码,例如:
override func viewDidLoad() {
super.viewDidLoad()
viewTwo = (UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ShowtimesView") as! ShowtimesView).view
segmentView.addSubview(viewTwo)
viewThree = (UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ReviewsView") as! ReviewsView).view
segmentView.addSubview(viewThree)
}