【问题标题】:UISegmented Control subviews not appearingUISegmentedControl 子视图没有出现
【发布时间】:2018-10-24 04:20:31
【问题描述】:

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

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

当我通过 .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)


}

【问题讨论】:

  • ShowtimesView 和 ReviewView 是视图控制器,它不是使用故事板或 xib 初始化的,它的视图是空的,所以它不显示。请在 viewDidLoad 更改 viewTwo 和 viewThree 的 bg 颜色后检查
  • 当两个子视图视图控制器是 .xib 文件时,此代码工作得非常好。只有当视图控制器与 stroyboard 而不是 .xib 文件分开时,我才会遇到这个问题。我不确定为什么,因为所有代码都完全相同。唯一的区别是故事板与 .xib 文件。
  • 如何在 xib 中初始化视图控制器?你在 ShowtimesView 的 init 方法中做了什么代码吗?您的代码不是从 stotyboard 或 xib 初始化 viewController 只是使用默认视图属性创建了 ViewController 的实例。
  • 不需要使用 init 和 swift 4。上面的代码在我的控制器是 .xib 时有效

标签: ios swift uiview uisegmentedcontrol


【解决方案1】:

问题是您说的是ShowtimesView().view 之类的东西。这不是从情节提要中加载视图控制器的方式!您需要与故事板对话并实例化视图控制器。

然而,即便如此,你所做的也是完全错误的。您不能使用视图控制器对其视图进行“垃圾箱潜水”,并将其随意查看到您的界面中。您必须使自己成为一个自定义的父视图控制器,并使另一个视图控制器成为您的孩子。你必须跳一场正式的舞蹈,而你没有跳。

【讨论】:

    【解决方案2】:

    你应该试试下面的代码。

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

    【讨论】:

    • DetailView 是原始视图控制器的一部分,看起来很好。它已经是一个子视图。这就是为什么我选择隐藏它而不是把它移到两个子视图后面。
    【解决方案3】:

    我通过为原始视图控制器中的每个子视图视图控制器创建一个容器来解决这个问题。我还确保将正确的名称添加到他们的故事板 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)
    
    
    }
    

    【讨论】:

      【解决方案4】:

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

      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,例如:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 2015-10-24
        • 2020-06-10
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        相关资源
        最近更新 更多