UISegmented控件子视图未出现

时间:2018-10-24 04:20:32

标签: ios swift uiview uisegmentedcontrol

我正在尝试使用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)


}

4 个答案:

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

1个“主要”是您的故事板名称
2“ ShowtimesView”是故事板ID,例如:

enter image description here

相关问题