UISegmented 控件子视图未出现

UISegmented Control subviews not appearing

我正在尝试使用 UISegmentedControl 在三个视图之间切换。我在主 viewcontroller 上的容器视图中有第一个视图。然后我在单独的 viewcontroller 上创建了另外两个视图。我在主 viewcontroller 的容器中为这两个视图编写了子视图。

我遇到的问题是,当我切换分段控件时,后两个视图不会显示。该段更改了容器并隐藏了第一个视图,但没有出现后两个视图。

当我通过 .xib 文件创建第二个两个视图时,我能够使用此方法。问题是现在我将它们作为故事板上的 viewcontrollers。

代码如下:

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


}

您应该尝试下面的代码。

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

问题是你在说 ShowtimesView().view 这样的话。那不是如何从故事板加载视图控制器!您需要与故事板对话并实例化视图控制器。

然而,即便如此,你所做的也是完全错误的。您不能使用视图控制器 "dumpster-dive" 来查看它的视图和随意查看您的界面的东西。您必须将自己变成一个自定义 parent 视图控制器,并将另一个视图控制器设为您的 child。有个正式的舞你要跳,你又不跳

我通过为原始 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)


}

您需要从情节提要中为初始化视图控制器编写代码,例如:

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 "Main" 是您的故事板名称
2 "ShowtimesView" 是这样的故事板 ID: